Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 不连续重复生成随机数_Objective C_Random - Fatal编程技术网

Objective c 不连续重复生成随机数

Objective c 不连续重复生成随机数,objective-c,random,Objective C,Random,如何从0-4生成随机整数,使相同的数字不会连续生成两次?例如,如果3是第一次生成的数字,那么0,1,2,4将是第二次随机生成的可能数字。如果第二次生成2,则第三次随机生成的可能数字为0,1,3,4,依此类推 intoldrand=; int oldrand = <prior random number>; int adder = randomNumberGenerator() % 4; int newrand = (oldrand + adder + 1) % 5; 整数加法器=r

如何从0-4生成随机整数,使相同的数字不会连续生成两次?例如,如果3是第一次生成的数字,那么0,1,2,4将是第二次随机生成的可能数字。如果第二次生成2,则第三次随机生成的可能数字为0,1,3,4,依此类推

intoldrand=;
int oldrand = <prior random number>;
int adder = randomNumberGenerator() % 4;
int newrand = (oldrand + adder + 1) % 5;
整数加法器=randomNumberGenerator()%4; int newrand=(oldrand+加法器+1)%5;
第一次之后就这样称呼它:

uint32_t number = myRandomNumber(5, 5);
number = myRandomNumber(5, number);

它可以使用2个数组生成;1是排序的,另一个是通过从排序后的

-(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;
    }

我尝试了Hot Click的答案,结果它为我生成了重复的答案(或超出范围的数字)。但它激励我想出一个对我有效的解决方案

我的代码是C#,但您可以修改它以满足您的需要

//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;
}
说明:

若之前并没有生成一个随机数,那个么第一个块只返回一个随机数

第二部分从“其他数字”生成一个随机数

例如,如果我的“max”为5,则可能的随机数为: 0,1,2,3,4

假设我的最后一个数字是2,现在我想要一个[3,4,0,1]中的随机数

所以我在last+1和last+max之间生成一个随机数。 i、 e.介于3(含)和7(不含)之间

[3,4,5,6]


用max(即5)修改这些数字中的任何一个,您将得到所需范围内的随机数:[3、4、0、1]

您不能使随机数减少随机数。使用NSSet进行uniquing。请参阅的可能副本。@MartinR-这些不是他的问题的副本。他不是要洗牌。@HotLicks:你说得对。我在读问题时忽略了连续这个词。很抱歉我不确定我是否了解此解决方案的工作原理。如果您能进一步解释,我将不胜感激。@oology-您有一个数字0。。4.您需要相同范围内的另一个数字,但不是完全相同的数字。因此,将1到4之间的任何数字添加到第一个数字,然后,如果加法溢出,“将其环绕”。所以如果你的第一个数字是3,你选择一个随机值2,然后加上3+2+1,你得到6,这比你的范围大。但是5圈对0,6圈对1,所以你的结果是1。谢谢你的解释。我希望我有足够多的赞成票来给你解释并回答赞成票。
randList=[self generateRandomNumbersFrom:0 to:4];
//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;
}