假设我有一个预先指定的m个项目集合S.我想生成一个从S中取得的n(独特)项目的随机组合。
有一种简单的方法可以在C中实现它吗?我看着兰德(),但它似乎没有做我想做的事。
(编辑以添加更多详细信息)
具体问题是从大小为m的数组中随机选择n个不同的元素。我的第一直觉是这样做:
idx_array = []
int idx = rand()%m
[如果idx不在idx_array中,请添加到idx_array。否则重复以上行。重复,直到idx_array的大小为n]
但看起来这个过程并不是真正随机的。我还是C的新手,真的只是想知道是否有用于此目的的内置功能。</ p>
任何帮助表示感谢。
答案 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。