2013-03-31 4 views
7

Как я могу генерировать случайные целые числа от 0 до 4 так, чтобы одно и то же число не генерировалось дважды подряд? Например, если 3 - это число, которое генерируется в первый раз, тогда 0,1,2,4 будут возможными числами для случайной генерации во второй раз. Если 2 генерируется второй раз, тогда 0,1,3,4 будут возможными числами для случайной генерации в третий раз и т. Д.генерирование случайных чисел без последовательного повторения

+0

Вы не можете делать случайный случайный случай. Используйте NSS для uniquing. – CodaFi

+0

Возможный дубликат [Сгенерировать случайное число из заданного числа] (http://stackoverflow.com/questions/15680582/generate-random-number-from-given-number) –

+0

См. Также http://stackoverflow.com/a/ 56656/1187415. –

ответ

5
int oldrand = <prior random number>; 
int adder = randomNumberGenerator() % 4; 
int newrand = (oldrand + adder + 1) % 5; 
+0

Я не уверен, что понимаю, как это решение работает. Буду признателен, если вы объясните дальше. – oopology

+1

@oopology - У вас есть номер 0 .. 4. Вы хотите, чтобы другое число в том же диапазоне, но не точно такое же число.Поэтому добавьте любое число от 1 до 4 к первому числу, затем, если добавление переполняется, «оберните его». Поэтому, если ваше первое число равно 3, и вы выбираете случайное значение 2, добавьте 3 + 2 + 1, вы получите 6, что больше вашего диапазона. Но 5 оберток до 0 и 6 оберток до 1, поэтому ваш результат равен 1. –

+0

спасибо за объяснение. Хотелось бы, чтобы у меня было достаточно голосов, чтобы дать ваше объяснение и ответить на голосование. – oopology

1
uint32_t myRandomNumber(uint32_t upperBound, uint32_t avoid) { 
    if (avoid < upperBound) { 
     --upperBound; 
    } 
    uint32_t number = arc4random_uniform(upperBound); 
    if (number >= avoid) { 
     ++number; 
    } 
    return number; 
} 

Назовем это, как это в первый раз:

uint32_t number = myRandomNumber(5, 5); 

назвать это, как это после того, как в первый раз:

number = myRandomNumber(5, number); 
0

он может быть сформирован с использованием 2 массивов; 1 сортируются и другой создается путем принятия случайных объектов образует сортируется как

-(NSMutableArray *)generateRandomNumbersFrom:(int) a to:(int)b 
{ 

    NSMutableArray * numbersWillBeChosen=[NSMutableArray new]; 
    NSMutableArray * randomList=[NSMutableArray new]; 
    //add the numbers that will create your ramdom list in order 
    for(int k=0;k<=(b-a);k++) 
    { 
     [numbersWillBeChosen addObject:@(a+k)]; 
    } 


    //create random list 
    for (int p=(b-a)+1; p>0; p--) { 

     int rand= arc4random()%p; 

     [randomList addObject:[numbersWillBeChosen objectAtIndex:rand]]; 

     [numbersWillBeChosen removeObjectAtIndex:rand]; 


    } 

    NSLog(@"%@",randomList); 

return randomList; 
    } 

и вы можете вызвать для вашей ситуации

randList=[self generateRandomNumbersFrom:0 to:4]; 
0

Я попытался ответить Hot облизать, и это в конечном итоге создание дубликатов для меня (или вне диапазона). Но это вдохновило меня придумать решение, которое сработало для меня.

Мой код C#, но вы можете изменить его в соответствии с вашими потребностями.

//Returns a random number not same as previous random number. ie. no 2 consec random 
public static int NonConsecRandom(int max, int? lastNum=null) 
{ 
    if (lastNum == null) 
     return Random.Range(0, max); 

    int last = (int)lastNum;    
    return Random.Range(last + 1, last + max) % max; 
} 

Пояснение:

первый блок просто возвращает случайное число, если не было ранее сгенерированное число.

Вторая часть генерирует случайное число из «других чисел».

Например, если мой «Макс» был 5, возможные случайные числа: 0, 1, 2, 3, 4

Допустим, мое последнее число было 2, теперь я хочу случайное число между [ 3, 4, 0, 1]

Поэтому я генерирую случайное значение между последним + 1 и последним + макс. т.е. между 3 (включительно) и 7 (не включительно)

[3, 4, 5, 6]

Mod любой из этих чисел с максимальной (т.е. 5) и вы получите случайное число желаемый диапазон: [3, 4, 0, 1]

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