цель генератора случайных чисел c

Возможный дубликат:
Как сгенерировать случайное число с плавающей точкой от 0 до 1?

Я хочу сгенерировать случайное число от 0 до 1 (равномерное распределение), и я использую:

float x = arc4random_uniform(1);

Однако это производит только 0.00000

я использовал

float y = arc4random() %11 * 0.1;

который возвращает случайное число в интервале, но я не уверен, что это равномерное распределение.

Почему первая функция не работает должным образом?


person user1734792    schedule 28.11.2012    source источник
comment
Вы не читаете документацию, вы не принимаете ответы, эээ...   -  person    schedule 28.11.2012
comment
unix.com/man-page/FreeBSD/3/arc4random_uniform Он возвращает целое число.   -  person Captain Giraffe    schedule 28.11.2012


Ответы (3)


Я использую:

float x = arc4random_uniform(1);

Однако это производит только 0.00000

Конечно, это так. arc4random_uniform() возвращает 32-битное целое число без знака. Он не возвращает float. То, что вы ищете, похоже на

#define RAND_PRECISION 1024

float x = arc4random_uniform(RAND_PRECISION) / (float)RAND_PRECISION;

Также,

Я не уверен, что это равномерное распределение.

Так как это не так. Использование оператора по модулю (%) приводит к неравномерному распределению.

person Community    schedule 28.11.2012
comment
Обратите внимание, что нет никакого способа дать действительно равномерное распределение на интервале с плавающей запятой, кроме одного примерно вида [N,2N-N*FLT_EPSILON], поскольку, как правило, значения с плавающей запятой не равномерно распределены. - person R.. GitHub STOP HELPING ICE; 28.11.2012
comment
@R.. Конечно, поэтому я назвал делитель PRECISION... - person ; 28.11.2012
comment
Я не понизил голос, но если бы ваша константа RAND_PRECISION была степенью двойки меньше 2^23 (плюс-минус 2, я ужасен в этом конкретном виде проблемы с забором), ваша формула, по крайней мере, дала бы равновероятность с равномерным интервалом ценности. Кроме того, компилятор, который пытается скомпилировать числа с плавающей запятой в соответствии со стандартом, не имеет другого выбора, кроме как скомпилировать / RAND_PRECISION в деление с плавающей запятой. Если бы это была степень двойки, это можно было бы оптимизировать до умножения. Наконец, умножение на 1.0f — странный способ преобразования int в float (но компилятор должен его оптимизировать). - person Pascal Cuoq; 29.11.2012
comment
Я ужасно разбираюсь в этой конкретной проблеме с забором - я вас понимаю. Я тоже. В любом случае, хорошие предложения и соответствующий обновленный мой ответ, но этот актерский состав действительно уродлив. - person ; 29.11.2012
comment
@PascalCuoq: они даже не расположены равномерно, если только RAND_PRECISION не является степенью двойки. - person R.. GitHub STOP HELPING ICE; 29.11.2012
comment
@R.. Да, это определенно то, что должно было означать мое первое предложение. - person Pascal Cuoq; 29.11.2012

Согласно документации, arc4random_uniform возвращает целое число, поэтому его использование с верхней границей 1 не даст того, что вы хотите.

Вот страница о функциях arc4random: http://www.unix.com/man-page/FreeBSD/3/arc4random_uniform/

person RonaldBarzell    schedule 28.11.2012
comment
+1, но, согласно справочной странице, он возвращает беззнаковое целое число - person fvu; 28.11.2012
comment
@fvu также не является целым числом без знака? Не будь придирчивым :) - person ; 28.11.2012
comment
Спасибо за +1, но ОП ожидал поплавок, поэтому беззнаковый или подписанный в этом отношении не имеет значения. - person RonaldBarzell; 28.11.2012

arc4random_uniform возвращает число до указанной вами верхней границы (например, arc4random_uniform(10) возвращает число от 0 до 9). Из-за этого arc4random_uniform(1) всегда должен возвращать 0 (что вы и видите). Если вам нужен случайный поплавок, вы должны увидеть этот ответ:

Создать случайное число с плавающей запятой между 0 и 1

person Mattia    schedule 28.11.2012