generating random numbers without consecutive repetition
如何以不连续生成两次相同的数字的方式从0-4生成随机整数? 例如,如果3是第一次生成的数字,则0、1、2、4将是第二次随机生成的可能数字。 如果第二次生成2,则0、1、3、4将是第三次随机生成的可能数字,依此类推。
1 2 3 | int oldrand = <prior random number>; int adder = randomNumberGenerator() % 4; int newrand = (oldrand + adder + 1) % 5; |
1 2 3 4 5 6 7 8 9 10 | uint32_t myRandomNumber(uint32_t upperBound, uint32_t avoid) { if (avoid < upperBound) { --upperBound; } uint32_t number = arc4random_uniform(upperBound); if (number >= avoid) { ++number; } return number; } |
第一次这样称呼它:
1 | uint32_t number = myRandomNumber(5, 5); |
第一次之后就这样称呼它:
1 | number = myRandomNumber(5, number); |
我尝试了Hot Lick的答案,结果最终为我生成了重复项(或超出范围数字)。但这启发了我想出一个对我有用的解决方案。
我的代码是C#,但是您可以对其进行修改以满足您的需求。
1 2 3 4 5 6 7 8 9 | //Returns a random number not same as previous random number. ie. no 2 consec random public static int NonConsecRandom(int max, int? lastNum=null) { if (lastNum == null) return Random.Range(0, max); int last = (int)lastNum; return Random.Range(last + 1, last + max) % max; } |
说明:
如果以前没有生成数字,则第一个块仅返回一个随机数。
第二部分从"其他数字"生成一个随机数。
例如,如果我的"最大"为5,则可能的随机数为:
0、1、2、3、4
可以说我的最后一个数字是2,现在我想要[3,4,0,1]中的一个随机数
所以我在last + 1和last + max之间生成一个随机数。
即3(含)和7(不含)之间
[3,4,5,6]
将这些数字中的任何一个修改为最大值(即5),您将获得所需范围内的随机数:[3,4,0,1]
它可以使用2个数组生成; 1被排序,另一个通过采用像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | -(NSMutableArray *)generateRandomNumbersFrom:(int) a to:(int)b { NSMutableArray * numbersWillBeChosen=[NSMutableArray new]; NSMutableArray * randomList=[NSMutableArray new]; //add the numbers that will create your ramdom list in order for(int k=0;k<=(b-a);k++) { [numbersWillBeChosen addObject:@(a+k)]; } //create random list for (int p=(b-a)+1; p>0; p--) { int rand= arc4random()%p; [randomList addObject:[numbersWillBeChosen objectAtIndex:rand]]; [numbersWillBeChosen removeObjectAtIndex:rand]; } NSLog(@"%@",randomList); return randomList; } |
你可以打电话给你
1 | randList=[self generateRandomNumbersFrom:0 to:4]; |