Вы должны избегать ограничения значений с помощью mod (%), если можете, потому что даже если используемый генератор псевдослучайных чисел (например, arc4random
) хорош для обеспечения равномерно распределенных чисел во всем его диапазоне, он можетне предоставлять равномерно распределенные числа в ограниченном диапазоне по модулю.
Вам также не нужно использовать литерал, такой как 0x100000000
, потому что в stdint.h есть удобная константа:
(float)arc4random() / UINT32_MAX
Это даст вам случайное плавание в интервале [0,1].Обратите внимание, что arc4random
возвращает целое число в интервале [0, 2 ** 32 - 1].
Чтобы переместить это значение в нужный интервал, вы просто добавляете минимальное значение и умножаете случайное значение с плавающей точкой наразмер вашего диапазона:
lowerBound + ((float)arc4random() / UINT32_MAX) * (upperBound - lowerBound);
В коде, который вы разместили, вы умножаете случайное плавание на весь беспорядок (lowerBound + (upperBound - lowerBound)), который на самом деле просто равен upperBound.И именно поэтому вы по-прежнему получаете результаты, меньшие, чем предполагалось.