Objective c 随机非重复数Xcode

Objective c 随机非重复数Xcode,objective-c,xcode,random,repeat,Objective C,Xcode,Random,Repeat,对不起,我英语不好,我是阿根廷人。我有一个问题,我正在制作一个琐事应用程序,从逻辑上讲,它不必再问同样的问题。我有30个问题,这是我的代码: -(IBAction)randomear{ random1=arc4random() % 30; if (random1 == 0) { labelpregunta.text = @"Las ovejas pueden nadar?"; } if (random1 == 1) {

对不起,我英语不好,我是阿根廷人。我有一个问题,我正在制作一个琐事应用程序,从逻辑上讲,它不必再问同样的问题。我有30个问题,这是我的代码:

-(IBAction)randomear{
    random1=arc4random() % 30;
    if (random1 == 0)
    {
        labelpregunta.text = @"Las ovejas pueden nadar?";
    }
    if (random1 == 1)
    {
        labelpregunta.text = @"Con que se tiñe la lana de negro?";
    }
    if (random1 == 2)
    {
        labelpregunta.text = @"De que material es el mejor casco?";
    }
    if (random1 == 3)
    {
        labelpregunta.text = @"Para fabricar lana necesitas 4 _____";
    }
}
我想创建一个NSArray,如果有一个数字重复,它会再次洗牌


如何操作?

您需要的实际上是一个(因为当新值出现时,您将对其进行扩展),并使用
-indexOfObject
检查以前选择的值。预先警告,NSMutableArray存储类型为
id
的对象,int是一个原语。在存储随机值之前,需要将其包装在NSNumber中。大概是这样的:

//.h
@property (nonatomic, strong) NSMutableArray *previouslySelectedValues;

//.m
-(IBAction)randomear{
    //I suppose this is an int, right?
    //Supongo que esto es un número entero.
    random1=arc4random() % 30;
    //check if the array can find the object.  It internally uses `-isEqual` in a loop for us
    //estamos comprobando si la matriz se puede encontrar el objeto
    if (![previouslySelectedValues indexOfObject:[NSNumber numberWithInt:random1]]) {
        if (random1 == 0)
        {
            labelpregunta.text = @"Las ovejas pueden nadar?";
        }
        if (random1 == 1)
        {
            labelpregunta.text = @"Con que se tiñe la lana de negro?";
        }
        if (random1 == 2)
        {
            labelpregunta.text = @"De que material es el mejor casco?";
        }
        if (random1 == 3)
        {
            labelpregunta.text = @"Para fabricar lana necesitas 4 _____";
        }

        //et cetera/ etcétera

        //add the object because it doesn't exist and we don't want to select it again.
        //Añadir el objeto a la matriz debido a que es nuevo
        [previouslySelectedValues addObject:[NSNumber numberWithInt:random1]];
    }
    else {
        //do nothing, or use the below pick again if you want
        //No hacer nada, o utilizar el método de abajo para elegir otro número

        //[self randomear];
        return;
    }
}

实际上,您需要的是一个(因为您将在新值出现时对其进行扩展),并使用
-indexOfObject
检查以前选择的值。预先警告,NSMutableArray存储类型为
id
的对象,int是一个原语。在存储随机值之前,需要将其包装在NSNumber中。大概是这样的:

//.h
@property (nonatomic, strong) NSMutableArray *previouslySelectedValues;

//.m
-(IBAction)randomear{
    //I suppose this is an int, right?
    //Supongo que esto es un número entero.
    random1=arc4random() % 30;
    //check if the array can find the object.  It internally uses `-isEqual` in a loop for us
    //estamos comprobando si la matriz se puede encontrar el objeto
    if (![previouslySelectedValues indexOfObject:[NSNumber numberWithInt:random1]]) {
        if (random1 == 0)
        {
            labelpregunta.text = @"Las ovejas pueden nadar?";
        }
        if (random1 == 1)
        {
            labelpregunta.text = @"Con que se tiñe la lana de negro?";
        }
        if (random1 == 2)
        {
            labelpregunta.text = @"De que material es el mejor casco?";
        }
        if (random1 == 3)
        {
            labelpregunta.text = @"Para fabricar lana necesitas 4 _____";
        }

        //et cetera/ etcétera

        //add the object because it doesn't exist and we don't want to select it again.
        //Añadir el objeto a la matriz debido a que es nuevo
        [previouslySelectedValues addObject:[NSNumber numberWithInt:random1]];
    }
    else {
        //do nothing, or use the below pick again if you want
        //No hacer nada, o utilizar el método de abajo para elegir otro número

        //[self randomear];
        return;
    }
}

我不会生成一个随机数并检查该数是否已被使用,而是创建一个由0到29个数字组成的NSMutableArray(每个数字都包装在一个NSNumber中),然后使用Gregory Goltsov在这个问题中提供的类别对数组进行随机洗牌

然后,您只需从NSMutable数组的开始迭代每个NSNumber对象。i、 e

#import "NSMutableArray_Shuffling.h // From Gregory Goltsov
NSMutableArray* randomNumbers = [[NSMutableArray alloc] init];
for(int i=0; i<30; i++) {
  [randomNumbers addObject:[NSNumber numberWithInt:i]];
}
[randomNumbers shuffle]; // From Gregory Goltsov

...

int lastIndex = 0;

-(IBAction)randomear
{
    if (lastIndex<30) {
        NSNumber* theRandomNumber = [randomNumbers objectAtIndex:lastIndex];
        int theQuestion = [theRandomNumber intValue];
        if (theQuestion == 0)  {
            labelpregunta.text = @"Las ovejas pueden nadar?";
        }
        if (theQuestion == 1) {
            labelpregunta.text = @"Con que se tiñe la lana de negro?";
        }
        if (theQuestion == 2) {
            labelpregunta.text = @"De que material es el mejor casco?";
        }
        if (theQuestion == 3){
            labelpregunta.text = @"Para fabricar lana necesitas 4 _____";
        }

        //et cetera/ etcétera    
        lastIndex++;
    } else {
        // No more questions
    }
}
#从Gregory Goltsov导入“NSMutableArray_Shuffling.h//
NSMUTABLEARRY*随机数=[[NSMUTABLEARRY alloc]init];

对于(int i=0;i,我不会生成一个随机数并检查该数是否已被使用,而是创建一个由0到29个数字组成的NSMutableArray(每个数字都包装在一个NSNumber中),然后使用Gregory Goltsov在这个问题中提供的类别对数组进行随机洗牌

然后,您只需从NSMutable数组的开始迭代每个NSNumber对象

#import "NSMutableArray_Shuffling.h // From Gregory Goltsov
NSMutableArray* randomNumbers = [[NSMutableArray alloc] init];
for(int i=0; i<30; i++) {
  [randomNumbers addObject:[NSNumber numberWithInt:i]];
}
[randomNumbers shuffle]; // From Gregory Goltsov

...

int lastIndex = 0;

-(IBAction)randomear
{
    if (lastIndex<30) {
        NSNumber* theRandomNumber = [randomNumbers objectAtIndex:lastIndex];
        int theQuestion = [theRandomNumber intValue];
        if (theQuestion == 0)  {
            labelpregunta.text = @"Las ovejas pueden nadar?";
        }
        if (theQuestion == 1) {
            labelpregunta.text = @"Con que se tiñe la lana de negro?";
        }
        if (theQuestion == 2) {
            labelpregunta.text = @"De que material es el mejor casco?";
        }
        if (theQuestion == 3){
            labelpregunta.text = @"Para fabricar lana necesitas 4 _____";
        }

        //et cetera/ etcétera    
        lastIndex++;
    } else {
        // No more questions
    }
}
#从Gregory Goltsov导入“NSMutableArray_Shuffling.h//
NSMUTABLEARRY*随机数=[[NSMUTABLEARRY alloc]init];

对于(int i=0;i“它不必再问相同的问题”是什么意思?你是说它应该只问每个问题一次,还是说它可以不止一次地问每个问题?我不知道objective-c,但也许你可以理解其中的原理:“它不必再问相同的问题”可能重复意思是?你的意思是它应该只问每个问题一次,还是说它可以问每个问题不止一次?我不知道objective-c,但也许你可以理解其中的原理:可能是我像你写的那样重复了,但它不起作用。(什么是“//[self randomear];”如果您取消对该行的注释,则该方法将调用自身,直到找到有效的数字。我将其放置为与您编写的一样,但它不起作用。(什么是“//[self randomear];”如果取消对该行的注释,则该方法将调用自身,直到找到有效的数字。