2011-05-21 125 views
1

我想用这个循环生成随机数。当我每次运行应用程序时,我都想生成随机数字而没有重复的在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 

回答

4

这是随机排列产生问题。阅读: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]); 
    } 
+0

+1 ,真棒,非常感谢。我如何提取使用索引的值。例如,在洗牌之后,数组就像{3,4,5,1,2},我想要得到第三个索引值5,那么我怎么能得到它? – Pugal 2011-05-21 11:44:58

+0

这是一个C语言数组,因此您可以在您的案例ar [2]中简单地使用ar [indexyouwant-1]。 – Roki 2011-05-21 11:52:15

0

可以是这样的,

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; 
}