【问题标题】:Random number without repeating不重复的随机数
【发布时间】:2012-07-19 16:46:09
【问题描述】:

我有 50 个数组元素的 NSMutableArray。我需要随机生成而没有任何重复。你能推荐一些示例代码吗?

【问题讨论】:

  • 应该是什么类型的元素? NSNumber, int, NSString?

标签: iphone nsmutablearray xcode4.2


【解决方案1】:

创建一个主数组的本地mutablearray副本,获取随机值后,从本地数组中删除随机索引处可用的对象,处理它直到数组计数为1。

【讨论】:

    【解决方案2】:

    这是获得小于 1000 的随机 int 的示例。

    int y =  arc4random() % 1000;
    

    要保持没有重复,只需在插入前检查

    【讨论】:

    • 最好使用arc4random_uniform(1000)或任何数字,没有模块化偏差。
    【解决方案3】:

    我假设您想要生成数字。这是我用来从 N 生成 M 个随机数的答案。虽然它不会将它们添加到 NSMutableArray 中,但我相信您可以根据需要调整此代码。

    #define M 10
    #define N 100    
    
    unsigned char is_used[N] = { 0 }; /* flags */
    int in, im;
    
    im = 0;
    
    for (in = N - M; in < N && im < M; ++in) {
      int r = rand() % (in + 1); /* generate a random number 'r' */
    
      if (is_used[r])
        /* we already have 'r' */
        r = in; /* use 'in' instead of the generated number */
    
      assert(!is_used[r]);
      vektor[im++] = r + 1; /* +1 since your range begins from 1 */
      is_used[r] = 1;
    }
    
    assert(im == M);
    

    为什么上述工作并不明显。但它有效。 [1..N] 范围内的 M 个数字将被均匀分布地挑选出来。

    注意,对于较大的 N,您可以使用基于搜索的结构来存储“已使用”的数字,从而获得一个 O(M log M) 且内存要求为 O(M) 的不错的算法。

    [Source]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多