c# - 从n个连续数字中随机选择数字

标签 c# algorithm

给定一个从0开始的n个连续数的整数数组,即

0,1,2,..n

我想随机选择 n/2 个数字。

假设 n=5 那么可能的集合将是 0,3,5

如何轻松实现?

最佳答案

您可以遍历数字并确定每个数字出现在结果中的概率:

int n = 5;
int left = (n + 1) / 2;
int[] result = new int[left];
Random rnd = new Random();

for (int i = 0; left > 0; i++) {
  if (rnd.Next(n + 1 - i) < left) {
    result[result.Length - left] = i;
    left--;
  }
}

注意:这将始终产生排​​序结果。

编辑:

这是一个创建 200000000 个结果的测试运行,计算生成的组合(其中二进制数表示组合,例如 100110 是 0、3、4):

010011 : 9999164
110001 : 10003346
010101 : 9990975
100101 : 9998154
101001 : 10006305
100110 : 10003350
101010 : 10000583
101100 : 9995335
011001 : 10000007
001011 : 10001492
001110 : 10001158
100011 : 9994680
110100 : 9998226
110010 : 9999954
011010 : 10002269
000111 : 10004752
010110 : 9996886
011100 : 9999196
111000 : 10001094
001101 : 10003074

关于c# - 从n个连续数字中随机选择数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14535421/

相关文章:

arrays - 最小化Matlab中数组列的总和

algorithm - 三对角矩阵的QR算法

c++ - 加减一组数字以达到一个值

algorithm - big-O中while循环的时间复杂度

c# - 在 C# 中 Hook IE 事件

c# - 从窗口获取线程ID

algorithm - 在什么情况下,[0,1) 上生成的随机数与 [0,1] 上生成的随机数之间的差异会产生影响?

c# - 用于测试多个项目并可能放弃的并行模式

c# - 如何获取、更新和删除 Windows Azure Pack 自定义资源提供程序的计划服务配额

c# - TPL 数据流 : design for parallelism while keeping order