C编程:从给定集合中生成随机n组合?

时间:2016-07-01 18:51:07

标签: c

假设我有一个预先指定的m个项目集合S.我想生成一个从S中取得的n(独特)项目的随机组合。

有一种简单的方法可以在C中实现它吗?我看着兰德(),但它似乎没有做我想做的事。

(编辑以添加更多详细信息)

具体问题是从大小为m的数组中随机选择n个不同的元素。我的第一直觉是这样做:

idx_array = []

int idx = rand()%m

[如果idx不在idx_array中,请添加到idx_array。否则重复以上行。重复,直到idx_array的大小为n]

但看起来这个过程并不是真正随机的。我还是C的新手,真的只是想知道是否有用于此目的的内置功能。<​​/ p>

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

不是生成从1到n的数字而是可能重复,而是对数组进行随机播放,然后选择第一个n元素:

#include <stdio.h>
#include <stdlib.h>

// Randomly shuffle a array
void shuffle (int * array, int n) {
  int i, j, tmp;

  for (i = n - 1; i > 0; i--) {
    j = arc4random_uniform(i + 1);
    tmp = array[j];
    array[j] = array[i];
    array[i] = tmp;
  }
}


int main (int argc, char const *argv[])
{
    const int m = 5;
    const int n = 3;

    int s[m] = {10, 20, 30, 40, 50};

    // Make a copy of s before shuffling it
    int t[m];
    for(size_t i = 0; i < m; i++)
    {
        t[i] = s[i];
    }
    shuffle(t, m);

    // Now, the first n elements of t is what you want
    for(size_t i = 0; i < n; i++)
    {
        printf("%d ", t[i]);
    }

    return 0;
}

归功于Roland Illig的Fisher-Yate改组函数。

答案 1 :(得分:-1)

这是一个抽样问题。有许多采样算法,但是很好地完成工作的简单算法被称为水库采样。有关油藏采样的详细信息,请参阅geekforgeeks