Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
Ios 创建一个不重复的随机数_Ios_Xcode_While Loop - Fatal编程技术网

Ios 创建一个不重复的随机数

Ios 创建一个不重复的随机数,ios,xcode,while-loop,Ios,Xcode,While Loop,我想知道如何使同一张图片不会连续选择两次。假设图片的编号为1-3。如果选择了图片1,那么接下来将不会选择图片1。如果选择了图片3,则可以再次选择图片1,依此类推 我知道我必须使用while语句,除非我不知道如何使用。以下是我目前的情况: - (void)chooseBackgroundImage{ if(thisNumber % 10 == 0){ int chooseBackgroundImage = arc4random() % 7; switch (chooseBack

我想知道如何使同一张图片不会连续选择两次。假设图片的编号为1-3。如果选择了图片1,那么接下来将不会选择图片1。如果选择了图片3,则可以再次选择图片1,依此类推

我知道我必须使用
while
语句,除非我不知道如何使用。以下是我目前的情况:

- (void)chooseBackgroundImage{
  if(thisNumber % 10 == 0){
    int chooseBackgroundImage = arc4random() % 7;
    switch (chooseBackgroundImage) {
        case 0:
            backgroundImage.image = [UIImage imageNamed:@"CyanToYellowBackground.png"];
            break;
        case 1:
            backgroundImage.image = [UIImage imageNamed:@"GreenToBlueBackground.png"];
            break;
        case 2:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToGreenBackground.png"];
            break;
        case 3:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToPurpleBackground.png"];
            break;
        case 4:
            backgroundImage.image = [UIImage imageNamed:@"PurpleToCyanBackground.png"];
            break;
        case 5:
            backgroundImage.image = [UIImage imageNamed:@"RedToBlueBackground.png"];
            break;
        case 6:
            backgroundImage.image = [UIImage imageNamed:@"YellowToRedBackground.png"];
            break;
       }
    }
}
我还尝试使用:

- (void)chooseBackgroundImage{
if(slogansGenerated % 10 == 0){
    int chooseBackgroundImage = arc4random() % 7;
    while(chooseBackgroundImage == oldChooseBackgroundImage){
    switch (chooseBackgroundImage) {
        case 0:
            backgroundImage.image = [UIImage imageNamed:@"CyanToYellowBackground.png"];
            break;
        case 1:
            backgroundImage.image = [UIImage imageNamed:@"GreenToBlueBackground.png"];
            break;
        case 2:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToGreenBackground.png"];
            break;
        case 3:
            backgroundImage.image = [UIImage imageNamed:@"OrangeToPurpleBackground.png"];
            break;
        case 4:
            backgroundImage.image = [UIImage imageNamed:@"PurpleToCyanBackground.png"];
            break;
        case 5:
            backgroundImage.image = [UIImage imageNamed:@"RedToBlueBackground.png"];
            break;
        case 6:
            backgroundImage.image = [UIImage imageNamed:@"YellowToRedBackground.png"];
            break;
    }
    int oldChooseBackgroundImage = chooseBackroundImage
  }
}

但似乎什么都不管用。有没有办法创建一个不重复的随机数?

使用此实用程序函数为您提供一个范围(在您的例子中为0和6)之间的随机整数-

#定义最大尝试计数10
//提供范围(包括两者)之间的随机数。
+(int)随机整数范围:(int)从int到integer:(int)到int排除:(NSArray*)排除数字{
NSAssert((toInt-fromInt)>0&&(!ExcludeNumber?是:(toInt-(fromInt-1))>=[ExcludeNumber计数],@“无效范围”);
静态int=0;
srandom(时间(空));
int randomInteger=fromInt+random()%(toInt-(fromInt-1));
如果(不包括数字!=零){
用于(NSNumber*不包括数字中的数字){
if([number intValue]==randomInteger){
if(randomAttempts==最大尝试次数){
//已达到获取随机数的最大尝试计数,但找不到一个。
打破
}
否则{
//递归调用以获取下一个数字。
++随机尝试;
randomInteger=[self-RandomIntegerRange:fromInt-toInteger:toInt-Exclude:ExcludeNumber];
}
打破
}
}
如果(随机尝试次数>=最大尝试次数){
//选择第一个单词中没有的数字。
randomAttempts=0;//为下一次尝试重置计数器。
随机整数=fromInt;

对于(;randomInteger使用此实用程序函数为您提供范围(在您的情况下为0和6)之间的随机整数-

#定义最大尝试计数10
//提供范围(包括两者)之间的随机数。
+(int)随机整数范围:(int)从int到integer:(int)到int排除:(NSArray*)排除数字{
NSAssert((toInt-fromInt)>0&&(!ExcludeNumber?是:(toInt-(fromInt-1))>=[ExcludeNumber计数],@“无效范围”);
静态int=0;
srandom(时间(空));
int randomInteger=fromInt+random()%(toInt-(fromInt-1));
如果(不包括数字!=零){
用于(NSNumber*不包括数字中的数字){
if([number intValue]==randomInteger){
if(randomAttempts==最大尝试次数){
//已达到获取随机数的最大尝试计数,但找不到一个。
打破
}
否则{
//递归调用以获取下一个数字。
++随机尝试;
randomInteger=[self-RandomIntegerRange:fromInt-toInteger:toInt-Exclude:ExcludeNumber];
}
打破
}
}
如果(随机尝试次数>=最大尝试次数){
//选择第一个单词中没有的数字。
randomAttempts=0;//为下一次尝试重置计数器。
随机整数=fromInt;

对于(;randomInteger我猜你在找这样的东西

-(int)getNonRepeatedRandom{
    int randomNumber = -1;
    do{
        randomNumber = arc4random_uniform(7);
    } while (randomNumber == oldRandomNumber);
    oldRandomNumber = randomNumber; //set the random number to old random so you can check it on the next run.
    return randomNumber;
}
不过,oldRandomNumber必须是iVar才能起作用


你应该使用arc4random_统一而不是arc4random模来消除模偏差。

我猜你在寻找这样的东西

-(int)getNonRepeatedRandom{
    int randomNumber = -1;
    do{
        randomNumber = arc4random_uniform(7);
    } while (randomNumber == oldRandomNumber);
    oldRandomNumber = randomNumber; //set the random number to old random so you can check it on the next run.
    return randomNumber;
}
不过,oldRandomNumber必须是iVar才能起作用


您应该使用arc4random_uniform而不是arc4random模量来消除模偏差。

以下可能是足够随机的,以满足您的需要:

首先添加一个实例变量,例如,
lastChosenBackgroundImage

之后:

int chooseBackgroundImage = arc4random() % 7;
加:


这确实意味着选择下一幅图像的可能性是选择其他任何一幅图像的两倍,但我怀疑这对于您的用例来说并不是一个重大问题。

以下可能是随机的,足以满足您的需要:

首先添加一个实例变量,例如,
lastChosenBackgroundImage

之后:

int chooseBackgroundImage = arc4random() % 7;
加:


这确实意味着选择下一幅图像的可能性是选择任何其他图像的两倍,但我怀疑这对于您的用例来说并不是一个重大问题。

我想我知道您想要什么,添加iVar,即currentSelection,然后使用if语句,检查当前pic是否是新选择的pic我想我知道您想要什么,添加iVar,即currentSelection,然后使用if语句,检查当前图片是否是新选择的图片这是我一直在尝试做的…在while语句中使用
!=
会生成一个不断进行的do while循环,使用
=
不会更改我犯了逻辑错误的数字。尽管此代码工作正常。它稍微有些复杂re random比公认的答案更随机。事实上,我现在确实使用arc4random_uniform。尽管我不完全理解为什么它会更随机,或者比arc4random()更好。谢谢!+1检查模偏差这里也更容易使用。这就是我一直在尝试做的…在while语句中使用
!=
会产生一个持续的do-while循环,而使用
=
不会改变我犯下的逻辑错误的数字。尽管此代码工作正常。它比acc稍微随机一些接受答案。我现在确实使用arc4random_uniform。尽管我不完全理解为什么它会更随机,或者比arc4random()更好。不过谢谢!+1在这里检查模偏差,uniform也更容易使用。