use*_*636 1 iphone random sdk arc4random
如何编写不重复数字两次的arc4random()?
例如.我正在使用开关和按钮.我不想再次生成重用相同的arc4随机数.如果我有arc4random那一代数2,4,42,32,42 ......我不想再出现42.
我该如何避免这种情况?
switch (arc4random() % 50 )
{
case 1:
text.text = @"You are silly boy";
break;
case 2:
text.text = @"Well, you very very silly"];
break;
case 3:
text.text = @"stop being silly"];
break;
case 4:
[text.text = @"silly... silly"];
break;
case 5:
text.text = @"what you silly boy"];
break;
...
case 0:
text.text = @"you silly"];
break;
}
Run Code Online (Sandbox Code Playgroud)
arc4random()
不是重复生成器,即每次调用都独立于所有其他调用.但这也意味着只是调用arc4random()
不会(通常)产生50个唯一数字.
一种方法是创建一个你想要的整数数组,然后遍历数组并将每一个与随机选择的另一个(在你的例子中)与(arc4random()%50)交换.它们只使用数组中的连续值,并在最后创建一个新数组并随机化它.
示例:列表中的值将是0到49之间的随机数,没有重复:
int n = 50;
int list[n];
for (int i = 0; i<n; i++)
list[i] = i;
for (int i = n-1; i>=1; i--) {
int ran = arc4random() % (i+1);
int tmp = list[i];
list[i] = list[ran];
list[ran] = tmp;
}
for (int i = 0; i<n; i++)
NSLog(@"%d", list[i]);
Run Code Online (Sandbox Code Playgroud)
这是Fisher-Yates shuffle的现代版本,专为计算机使用而设计,由Richard Durstenfeld推出.
注意:使用mod创建一个子集会产生偏差,但在50的情况下,偏差可以忽略不计.
归档时间: |
|
查看次数: |
2018 次 |
最近记录: |