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

New arc4random()%x; different from Previous number

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

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

为了不生成与之前生成的相同的数字,最有效的添加方法是什么。

我不是要洗牌所有 24 个,因为我确实想要重复,只是最好不要将相同数字的 2 个直接放在彼此之后...

我想过把之前的数字单独存起来,然后比较,如果匹配,就再做一次,但是我想不通,比如同一个数字连续出现3次...我不太可能知道,但这是可能的。

谢谢。

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

NSInteger lastRandom;

并将其初始化为 -1

然后当你想要一个新的随机数时,你可以这样做:

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

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

您正在寻找的很像洗牌:您希望 24 个值以随机顺序出现,并且就像您希望在出现后将每张牌从一副牌中取出,这样它就不会出现'不会再出现(直到你重新洗牌)。

iOS9 及更高版本中的 GameplayKit 为此类随机化任务提供了实用程序。特别是,这个问题是由 GKShuffledDistribution class:

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

在所有 24 个值都用完之前,这个不会重复。

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