Random 从列表中选择n个随机条目

Random 从列表中选择n个随机条目,random,Random,我有一个N个项目的数组,我想从中选择M个不同的随机项目,其中M{1,2},2->{1,3},3->{2,3})。原始数组需要保持不变。

我有一个N个项目的数组,我想从中选择M个不同的随机项目,其中M 我目前通过选择一个随机索引来实现这一点,检查它是否已经被选中,如果没有在我的子集中使用它。问题是,这需要我存储一个已选择项目的列表,以便知道我是否已经使用了一个

有没有一种方法可以生成跨越一组索引的随机数,但直到它们循环回到开始时才重复


提前欢呼

以防您破坏原始阵列:


选择0和N-1之间的随机元素位置,获取选定元素。将数组的最后一个元素移动到选定元素的位置。现在数组中少了一个元素。您可以重复此过程M次。

第一个元素有
M/N
被选择的机会,因此以此概率选择它,然后递归或迭代进行

在伪码中,
rand(k)
将给出一个在
1
k
之间均匀选择的随机整数:

for (i = N to 1)
{
   if (rand(i) <= M)
   {
      choose i;
      M--;
   }
}
for(i=N到1)
{

如果(rand(i)有N个choose M=N!/((N-M)!M!)可能要选择的子集,那么选择这些子集的一些顺序,然后选择1到N之间的随机数choose M,然后使用该子集


例如,如果N=3,M=2,您的排序可以是{1,2},{1,3},{2,3},因此您可以从1到3中选择一个随机数,然后取相应的元素(1->{1,2},2->{1,3},3->{2,3})。

原始数组需要保持不变。