Генерировать случайные числа без дубликатов в iPhone?

#iphone #random #numbers

#iPhone #Случайный #числа

Вопрос:

Я хочу генерировать случайные числа, используя этот цикл. Когда я каждый раз запускаю приложения, я хочу генерировать случайные числа без дубликатов.

Например:

 for(int i = 0; i < 5; i  )
{ 
     //  int d = random() % i;

       NSLog(@"The Value %d",i);

       NSLog(@"The random Number %d",i);
}

Actual Number Random Number
      1            4
      2            5
      3            2 
      4            1 
      5            3
  

Ответ №1:

Это проблема генерации случайных перестановок. Прочитайте это:http://www.techuser.net/randpermgen.html

Основная идея (в псевдокоде):

 for (i=1 to n) ar[i] = i;
for (i=1 to n) swap(ar[i], ar[Random(i,n)]);
  

В вашем случае:

  int ar[5],i,d,tmp;
    for(i = 0; i < 5; i  ) ar[i] = i 1; 
    for(i = 0; i < 5; i  ) {
        d = i   (random()%(5-i));
        tmp = ar[i];
        ar[i] = ar[d];
        ar[d] = tmp;
        NSLog(@"%d",ar[i]); 
    }
  

Комментарии:

1. 1, потрясающе, большое спасибо. Как я могу извлечь значения, используя index. Например, после перетасовки массив имеет вид {3,4,5,1,2}, я хочу получить третье значение индекса 5, так как я могу это получить?

2. Это массив на языке C, поэтому вы можете просто использовать ar[indexyouwant-1] в вашем случае ar[2].

Ответ №2:

Может быть что-то вроде этого,

 int rand[5] = {0};
int max = 5;

for(int i = 0; i < max; i  ){
 int r = random() % max   1;
 while([self foundNumber:r inArray:rand limit:i){
  r = random() % max   1;
 }
 rand[i] = r;
}

- (BOOL) foundNumber:r inArray:rand limit:l {
 for(int i = 0; i < l; i  ){
  if(rand[i] == r) return YES;
 }
 return NO;
}