非重复arc4random_uniform(Non-repeating arc4random_uni

2019-06-23 18:26发布

我一直试图让非重复arc4random_uniform为年龄现在的工作为我的iPhone应用程序。 去过了所有的问题,并与本计算器上没有运气的答案,现在我希望有人能帮助我。 我想要做的就是为选择1和104我已经得到了它的工作到它选择13个不同的号码点之间13张不同的随机数,但有时候他们两个是相同的。

int rand = arc4random_uniform(104);

这是我在做什么,然后我使用兰特从阵列选择。 如果它更容易洗牌数组,然后从中挑选13从上面的话,我想试试,但我需要怎样的帮助,因为这似乎更难。

感谢您的任何意见。

Answer 1:

有没有保证说ar4random_uniform()不会重复。 想想它的第二个 - 你问它,如果你做的105倍,它没有选择,只能重复其早期选择之一,以生产0 103之间的数字。 功能怎么知道你要多少次要求是多少?

你要么必须检查你已经得到了,并要求一个新的,如果它是一个重复,或随机排列的号码列表。 应该有任意数量的用于上做题。 这里是最古老的一个: 什么是随机播放一个NSMutableArray的最佳方式? 。

还有关于非重复的随机数了不少问题: https://stackoverflow.com/search?q=%5Bobjc%5D+non-repeating+random+numbers



Answer 2:

您可以创建NSMutableSet和实现它是这样的:

NSMutableArray* numbers = [[NSMutableArray alloc] initWithCapacity: 13];
NSMutableSet* usedValues = [[NSMutableSet alloc] initWithCapacity: 13];

for (int i = 0; i < 13; i++) {
  int randomNum = arc4random_uniform(104);
  while ([usedValues containsObject: [NSNumber numberWithInt: randomNum]) {     
    randomNum = arc4random_uniform(104)
  }
  [[usedValues addObject: [NSNumber numberWithInt: randomNum];
  [numbers addObject: [[NSNumber numberWithInt: randomNum];
}


Answer 3:

另外,您还可以创建的每105个整数唯一的一个,和arc4random_uniform([arrayName中的计数]),然后从阵列中删除同一个可变数组,然后你会得到一个随机的int值的时间不重复(虽然较小该数组被越容易预测下一个数字是什么,只是简单的概率)



Answer 4:

我已经找到了这个确切的问题,最好的算法描述如下:

算法来选择单一的价值,随意组合?

代替洗牌104个元件阵列的,只需通过13次需要循环。 这是我在实现目标C的算法:

// Implementation of the Floyd algorithm from Programming Pearls.
// Returns a NSSet of num_values from 0 to max_value - 1.
static NSSet* getUniqueRandomNumbers(int num_values, int max_value) {
    assert(max_value >= num_values);
    NSMutableSet* set = [NSMutableSet setWithCapacity:num_values];
    for (int i = max_value - num_values; i < max_value; ++i) {
        NSNumber* rand = [NSNumber numberWithInt:arc4random_uniform(i)];
        if ([set containsObject:rand]) {
            [set addObject:[NSNumber numberWithInt:i]];
        } else {
            [set addObject:rand];
        }
    }
    return set;
}


文章来源: Non-repeating arc4random_uniform