新的 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
(等)可以为您提供多种控制游戏中随机行为的选项:确保不同的随机游戏系统不会影响彼此,确保您可以重复某些随机序列进行测试,或者在客户端和服务器之间重复某些随机序列,生成遵循特定模式的随机数,等等。
我有这行代码来计算一个随机数:
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
(等)可以为您提供多种控制游戏中随机行为的选项:确保不同的随机游戏系统不会影响彼此,确保您可以重复某些随机序列进行测试,或者在客户端和服务器之间重复某些随机序列,生成遵循特定模式的随机数,等等。