原文地址:
http://www.blogjava.net/lhulcn618/archive/2010/02/21/313522.html
需求描述:从 0 到 n 之间选 k 个不重复的数组成一个序列。
伪代码如下:
for(i = 0; i < n; i++)
{
x[i] = i;
}
for(i = 0; i < k; i++)
{
t = rand(i,n-1);
swap(x[i], x[t]);
out(x[i]);
}
其中,rand(a,b) 产生一个 a 到 b 之间的随机数,swap(a,b) 交换 a 和 b 的值,out(a) 把 a 输出作为结果。
首先,x数组里把0到n-1的所有数都存储了,而最后输出的都是x数组里的值,所以满足输出的数是k个0到n-1的数。
然后,我们对于第 i 次随机,产生一个 i 到 n-1 的下标 t ,并把x[t] 和x[i]交换,将其输出,这样每次产生的数都是之前没有出现过的数,因为之前出现过的数都在x[0] 到 x[i-1]里呢!这样就保证了输出数据的不重复性。
最后,我们考察输出数据的“随机性”,显然,因为交换操作,使得所有没有出现过的数都在x[i] 到 x[n-1]中存着呢,所以被选中的概率相等。
最后附上 Java 实现:
public static void generateRandomNum(int count, int max) {
int temp = 0;
int[] seed = new int[max];
for (int i = 0; i < max; i++) {
seed[i] = i + 1;
}
int[] ranArr = new int[count];
Random ran = new Random();
for (int i = 0; i < count; i++) {
int j = ran.nextInt(max) % (max+ 1);
temp = seed[i];
seed[i] = seed[j];
seed[j] = temp;
ranArr[i] = seed[i];
}
System.out.println(Arrays.toString(ranArr));
}
PS: 后来我发现 Java 的 Collections.shuffle() 方法的实现,也是采用的这个算法。看来这个算法是相当的经典啊!
分享到:
相关推荐
5. 循环结束后,集合中的所有元素就是一组不重复的随机数。 在易语言中,这个过程可以用以下伪代码表示: ```易语言 定义 集合 已生成随机数集 {} 定义 整数 需要的随机数个数 = 10 循环 需要的随机数个数次 ....
这个标题"0-99的不重复随机数"表明我们要讨论的是如何利用编程语言生成一个包含0到99所有整数且每个数只出现一次的随机序列。 描述中提到“代码很精简”,这可能是指实现该功能的代码行数较少,易于理解和实现。...
本文将深入探讨一种在Java中实现的高效算法,该算法能够生成指定范围内的不重复随机数数组,特别适用于随机组题等应用场景。 ### 核心知识点解析 #### 1. 算法原理 算法的核心思想是首先创建一个包含指定范围内...
在易语言中,我们经常会遇到需要生成一组不重复随机数的需求,比如在制作抽奖程序或者模拟随机事件时。"易语言取随机数不重复源码.zip"这个压缩包文件显然包含了实现这一功能的源代码。 生成不重复随机数的关键在于...
以上就是VB2012中生成不重复随机数、排序以及查找最大值和最小值的完整过程。需要注意的是,当生成的随机数范围过大时,可能会导致循环运行时间过长,因此在实际应用中可能需要采用更高效的数据结构或算法,比如使用...
下面是一个完整的C#程序示例,演示了如何使用随机数生成器生成随机数,并使用冒泡排序算法对数组进行排序: ```csharp using System; class Program { static void Main(string[] args) { int[] nums = new int...
然后,你可以结合LARGE函数来提取数组中的最大值,不断更新数组,直到达到所需数量的不重复随机数。 在实际操作中,可能会遇到性能问题,尤其是当目标范围非常大时。为了避免Excel因计算量过大而变慢,可以考虑分批...
在很多系统开发过程中,例如游戏开发或数据安全领域,都需要用到一组不重复的随机数。这些随机数可以用于生成唯一的ID、抽奖号码等。为了确保每次生成的随机数都是独一无二的,需要采取一定的策略来避免重复。 ####...
总的来说,易语言组合6位不重复数字源码是一个很好的学习实例,它涵盖了算法设计、递归、回溯和数组操作等多个编程基础概念。通过分析和实现这个源码,开发者可以提升其在算法设计和易语言编程上的技能。
### JavaScript 获取不重复随机数的方法比较 在JavaScript中,生成一系列不重复的随机数是一个常见的需求,尤其是在游戏开发、抽奖程序或数据处理等场景中。本文将详细介绍三种不同的方法来生成这种类型的随机数,...
以下是对PHP产生不重复随机数的五种方法的详细解析: **方法一:基于数组的随机打乱** ```php $numbers = range(1, 50); shuffle($numbers); $num = 6; $result = array_slice($numbers, 0, $num); print_r($result...
2. **数组处理**:数组是存储一组相同类型数据的容器,在本程序中,数组`C()`被用来存储生成的随机数。 3. **循环结构**:循环结构如`For`循环被用来控制程序流程,例如生成指定数量的随机数或对数组进行遍历操作...
接下来介绍一种更实用的方法,即生成一个特定范围内的不重复随机数数组,并按指定顺序排列。下面是一个使用递归来生成从大到小排列的随机数数组的例子: ```javascript function create(n) { var temp = Math....
3. **使用集合来跟踪已生成的随机数**:如果你需要生成一定范围内的所有不重复随机数,可以使用一个集合(如`HashSet<int>`)来存储已生成的随机数,每次生成新随机数时检查该集合,确保不与已有的随机数重复。...
在某些场景下,我们可能希望复现一组随机数,此时可以固定种子。例如,在测试或调试中,固定种子可以使每次运行得到相同的随机数序列: ```cpp std::mt19937 gen(1234); // 使用固定的种子 ``` 7. **并行生成...
两种语言的关键技术点在于如何生成不重复的随机数。这里使用了“旗标”(Flag)变量,当发现新生成的随机数已经在数组中时,设置`flag`为`True`,然后退出内部循环,重新生成一个新的随机数,直到找到一个未出现过的...
总的来说,`random.sample()`是Python中生成不重复随机数的一个强大工具,它提供了简洁、高效的解决方案,适合各种需要无重复随机数的场合。通过深入理解和灵活运用,可以极大地丰富我们的程序设计和问题解决策略。
综上所述,易语言中生成不重复随机数涉及到的主要知识点包括:随机数的生成、数据结构的应用、算法的选择以及循环和条件判断的使用。在编写代码时,要考虑到效率和内存使用,选择合适的方法来满足需求。
对于不重复随机数的生成,一种常用的方法是使用集合或者数组来跟踪已生成的随机数,确保不会重复。例如,可以创建一个大小为10000的数组,每生成一个随机数,就将其填入数组的一个位置,直到所有位置都被填满。这样...
在循环中,每次生成一个随机数并检查是否已存在于数组或集合中,如果不存在则添加并继续生成下一个。以下是一个简单的示例: ```vba Sub GenerateUniqueRandoms() Dim randNum As Long Dim uniqueNumbers() As ...