Вынуть число из диапазона arc4random ( )%x

Я использую arc4random для генерации случайного числа. Я генерирую число от 0 до 2. Это идентификатор смены цвета в игровом цикле. Если число равно 1, следующее поколение должно исключить число 1. Как я могу это сделать?

int x = arc4random()%3;

person Jonathan Leyes    schedule 12.02.2014    source источник
comment
Итак, вы хотите случайным образом получить либо 0, либо 2? Если это так, почему бы не сделать arc4random()%2 и если результат равен 1, добавить к нему 1? Кроме того, как правило, лучше использовать arc4random_uniform для генерации случайных чисел от 0 до границы, так как это будет генерировать числа равномерно, а % - нет.   -  person James Snook    schedule 13.02.2014


Ответы (2)


Есть два основных способа сделать это.

Более простой, но потенциально менее эффективный:

int x;
do {
    x = arc4random() % 3;
} while (x == 1);

или немного более сложный, но более детерминированный:

int x = arc4random() % 2;
if (x > 0) x++;
person Kevin    schedule 12.02.2014
comment
Не делайте этого первым способом с генератором чисел, который на самом деле является случайным, никогда не гарантируется, что он выйдет из цикла do while. - person James Snook; 13.02.2014
comment
да, я пошел по второму пути, это так просто, что мне стыдно, что я не дошел до этого сам :D - person Jonathan Leyes; 13.02.2014

Исключить это:

uint32_t identifier = 1; // << the number to exclude
uint32_t NIdentifiers = 1;
uint32_t NNumbers = 3;
uint32_t NPossibleIdentifiers = NNumbers - NIdentifiers;

uint32_t result = arc4random_uniform(NPossibleIdentifiers);
if (identifier == result)
 ++result;

Примечание: отдавайте предпочтение arc4random_uniform вместо arc4random и по модулю.

person justin    schedule 12.02.2014