2014-11-14 3 views
0

Я работаю над программой, которая выполняет множество вычислений, основанных на случайности (сумасшедшая, да!), И чтобы упростить расчеты в n-й степени, я работал с числами с плавающей запятой.«Лучший» способ генерации случайных поплавков?

Основной формат я использую вдоль линий:

event_chance = 47.25 
randnum = random.uniform(0.01, 100.0) 
if randnum <= event_chance: 
    do_something 
else: 
    dont 

Это, мне кажется, работает нормально, но я знаю, поплавки работать неисповедимы ... Я получаю результаты, Я думаю, что я? то есть. мои события стреляют с определенным шансом, который я установил?

+0

не слишком много выкапывать - перезагрузка семени для случайного генератора должна быть достаточной? random.seed (x) - это место, где вы меняете свое семя. – ha9u63ar

+2

Я сомневаюсь в выборе 0,01, а не 0 в качестве нижнего конца - кажется очень произвольным. Тем не менее, вы должны иметь возможность тестировать его. Соберите несколько миллионов образцов, подсчитывая, сколько раз вы попадаете в каждую ветку вашего if-утверждения. Он достаточно близко к целевой частоте? –

ответ

2

Я подозреваю, что ваши вероятности немного отклонены на 0,01%.

Для таких вещей, я хотел бы использовать random() напрямую - он вернет с плавающей точкой от 0 до 1 - это может быть 0, оно никогда не будет 1. Итак, if (random.random()>=0.4725): ... - в худшем случае ошибка должна быть Обратите внимание, что при запросе случайного числа в указанном диапазоне некоторые генераторы случайных чисел DO, в то время как другие НЕ включают большое число (поэтому случайное целое число с низкое значение 0 и максимум 3, для некоторых генераторов случайных чисел будут возвращаться 0, 1 или 2, тогда как другие могут возвращать 0, 1, 2 или 3). Прочтите документацию.

В случае random.uniform, The end-point value b may or may not be included in the range depending on floating-point rounding in the equation a + (b-a) * random(). Для чисел с плавающей запятой это, конечно, гораздо меньше.

Конечно, сравнение двух чисел с плавающей запятой с '=' всегда является рискованным.

+0

Спасибо - очень информативно! – Groundhog

Смежные вопросы