从给定数字生成随机数

时间:2013-03-28 11:27:12

标签: ios objective-c arc4random

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

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

2 个答案:

答案 0 :(得分:2)

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

如果我理解正确:您想要随机选择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);

答案 1 :(得分: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;
}

希望这有帮助,谢谢。

谢谢。快乐的编码