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

C编程:从给定集合生成随机n-组合?,c,C,假设我有一组预先指定的m项。我想生成一个随机组合的n(唯一)项目采取从S 有没有一种简单的方法可以在C中实现这一点?我查看了rand(),但它似乎没有达到我想要的效果 (编辑以添加更多详细信息) 具体问题是从大小为m的数组中随机选择n个不同的元素。我的第一反应是这样做: idx_数组=[] int idx=rand()%m [如果idx不在idx_数组中,则添加到idx_数组中。否则,在第行上方重复。重复,直到idx_数组的大小为n] 但这个过程看起来并不是真正随机的。我对C还是新手,只是想知道

假设我有一组预先指定的m项。我想生成一个随机组合的n(唯一)项目采取从S

有没有一种简单的方法可以在C中实现这一点?我查看了rand(),但它似乎没有达到我想要的效果

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

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

idx_数组=[]

int idx=rand()%m

[如果idx不在idx_数组中,则添加到idx_数组中。否则,在第行上方重复。重复,直到idx_数组的大小为n]

但这个过程看起来并不是真正随机的。我对C还是新手,只是想知道是否有一个内置函数用于此目的


感谢您的帮助。

这是一个采样问题。有很多采样算法,但一个简单的算法做得很好,称为储层采样。有关储层采样的更多详细信息,请参阅。

不要生成从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;
}
#包括
#包括
//随机洗牌数组
无效洗牌(整数*数组,整数n){
int i,j,tmp;
对于(i=n-1;i>0;i--){
j=arc4random_均匀(i+1);
tmp=阵列[j];
数组[j]=数组[i];
数组[i]=tmp;
}
}
int main(int argc,char const*argv[]
{
常数int m=5;
常数int n=3;
int s[m]={10,20,30,40,50};
//在洗牌前复制一份s
int t[m];
对于(大小i=0;i

Fisher-Yate洗牌功能的成功归功于。

请展示您的研究成果。请先阅读第页。可能的答案太多,或者好的答案对于这种格式来说太长。请添加详细信息,以缩小答案集或隔离一个可以在几段时间内回答的问题。
,但这个过程看起来并不是真正随机的。我对C还是个新手,真的只是想知道是否有一个内置函数用于此目的。
No,没有计算机可以生成真正的随机数。这是伪随机的。虽然答案很好,但你实际上是在说“那边有答案”。。。你能在答案中加入一些内容吗?一个经典的表演热门。。。你洗牌整个数组只是为了得到一个样本。。。如果数组是2Gb的数据,而您正在采样512字节,那就太糟糕了。古老的格言是:先让它工作,然后让它快速工作。洗牌算法在
O(n)
中运行,非常有效。然而,如果您处理的是这种大小的数组,显然需要进行一些优化。您显然是对的,您的洗牌方法是解决该问题的经典方法。我认为这是他们在世界各地的学校教的东西。。。但这也是我必须指出性能问题的部分原因。当应用已知的解决方案时,人们忘记了使用他们的判断。无论如何,希望你能在回答中指出性能警告,我将投我一票:)