在一个整数区间里产生一组不重复的随机数

做图形久了,发觉做逻辑的东西也挺有意思,逻辑的内容也需要好的算法。

问题描述:如何在一个整数区间内(例如0-n-1)产生一组(m个)不重复的随机数

一般解法: 设置一个n长的数组用于标记,用rand随机产生一个数,如果之前已生成过,则重新生成随机数。直到得到一个未生成过的。

最优解法:

for(i = 0; i < n; i++)
{
      x[i] = i;
}
for(i = 0; i < m; i++)
{
      t = rand(i, n-1);
      swap(x[i], x[t]);
      out(x[i]);
}

1. 将区间数值存在一个数组x[i]

2. 因为要取m个数,所以做m次遍历操作

3. 每次都从i到n-1去取数,取到的数与x[i]交换

4. 这个算法用了一个巧妙的方式剔出了每次已经取过的数。

原文地址:https://www.cnblogs.com/dawn/p/2968883.html