新arc4random()%x;与以前的号码不同

时间:2015-11-30 22:22:29

标签: ios random arc4random

我有这行代码来计算随机数:

    myRand = arc4random()%24; //0:23

最有效的添加方式是什么,以便不会生成之前生成的相同数字。

我并没有试图改变所有24个,因为我想要重复,最好不要直接相同的数字中的2个...

我想分别存储前一个号码,然后比较它,如果匹配,只需再做一次,但是如果例如相同的号码连续出现3次我就无法弄清楚...不太可能我知道,但它是可能的。

感谢。

2 个答案:

答案 0 :(得分:2)

在ivar中保留对先前生成的数字的引用。

NSInteger lastRandom;

并将其初始化为-1

然后,当您想要一个新的随机数时,您可以执行以下操作:

NSInteger newRandom;
do {
    newRandom = arc4random_uniform(24);
while (newRandom != lastRandom);
lastRandom = newRandom;

这个小循环将确保您的新随机数与您生成的最后一个不同。

答案 1 :(得分:0)

你正在寻找的东西就像一张卡片随机播放:你希望24个值按照随机顺序出现,就像你想要在牌组出现后从牌组中拿出来的牌所以它不会#&# 39;再次上来(直到你重新洗牌)。

iOS 9及更高版本中的GameplayKit为这样的随机化任务提供了实用程序。特别是,这个由GKShuffledDistribution类解决:

id<GKRandom> dist = [GKShuffledDistribution distributionForDieWithSideCount:24];
myRand = [dist nextInt];

这个不会重复,直到所有24个值都用完为止。

更一般地说,使用GKRandom(等)代替arc4random(等)可以为您提供多种控制游戏中随机行为的选项:确保不同的随机游戏系统不会影响彼此,确保您可以重复某些随机序列进行测试,或者在客户端和服务器之间,制作遵循特定模式的随机数,等等。