3

我陷入了一个关于随机数的问题。我正在使用arc4random(). 我想首先生成 0-9 之间的随机数。所以我正在使用:

int RandomNumber = arc4random() % 9;

很好。现在假设我得到了 8。我不希望我的新随机数是 8。所以我做了以下工作:

NSMutableArray *aryTemp = [NSMutableArray new];
for (int i = 0; i < [aryTemp Count] < 9; i++) {
   int RandomNumber;
   do {
      RandomNumber = arc4random() % 9;
   }
   while ([aryTemp containsObject:[NSNumber numberWithInt:RandomNumber]])
   [aryTemp addObject:[NSNumber numberWithInt:RandomNumber]];
}

所以我生成一个随机数,而不是将其添加到数组中,而不是检查下一个随机数是否是上一个生成的随机数?如果不是,则将其添加到数组中。

它适用于少数起始数字,但是当我当时没有多少选择时,我生成所需随机数的机会非常少,而由于冗余随机数,循环过程需要大量时间。

我在找什么我想要0、1、2、3、4、5、6、7、8、9的随机数如果我下次第一次得到6,随机数必须在这些数字中只有0, 1、2、3、4、5、7、8、9

4

2 回答 2

2

编辑:上面评论中链接的答案提出了一个更优雅的解决方案 - 将数组改组,尽管它使用与我天真的方法相同的原则:)

如果我理解正确:您想随机选择 0-9 范围内的所有项目。

我最初的方法是创建一个包含范围内所有项目的包。每次您随机选择一个项目 - 将其从包中取出,这样您就不会再次选择它。

下面的代码片段应该实现这一点:

int randomNumber;

// Fill remainingNumbers array with numbers 0-9
NSMutableArray *remainingNumbers = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
    [remainingNumbers addObject:[NSNumber numberWithInt:i]];
}

// Create tempNumbers array to store our random numbers in
NSMutableArray *tempNumbers = [NSMutableArray array];


for (int i = 0; i < 9; i++) {
    // Create a random number in the range of the indexs for remainingNumbers array
    int maxIndex = [remainingNumbers count] -1;
    randomNumber = arc4random() % maxIndex;

    // Add random number to tempNumbers array
    [tempNumbers addObject:[remainingNumbers objectAtIndex:randomNumber]];

    // Remove the number from the remaining numbers so we don't add duplicates
    [remainingNumbers removeObjectAtIndex:randomNumber];
}
// Add final number
[tempNumbers addObject:[remainingNumbers objectAtIndex:0]];


// Print the array of 'randomly selected numbers'
NSLog(@"The array is: %@", tempNumbers);
于 2013-03-28T12:18:11.133 回答
0

试试这个

//call method 
int tempvalue = (int) [self randomFloatBetween:0 secondParam:9]; // pass number as per your need


-(float) randomFloatBetween:(int) smallNumber secondParam:(float) bigNumber
{
    float diff = bigNumber - smallNumber;
    return (((float) rand() / RAND_MAX) * diff)
    + smallNumber;
}

希望这会有所帮助,谢谢。

谢谢你。快乐编码

于 2013-03-28T12:34:29.020 回答