`
yhz61010
  • 浏览: 562426 次
  • 来自: -
博客专栏
63c13ecc-ef01-31cf-984e-de461c7dfde8
libgdx 游戏开发
浏览量:12269
社区版块
存档分类
最新评论

[转] 高效的产生一组不重复的随机数

阅读更多
原文地址:
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() 方法的实现,也是采用的这个算法。看来这个算法是相当的经典啊!
分享到:
评论

相关推荐

    易语言源码易语言取不重复随机数.rar

    5. 循环结束后,集合中的所有元素就是一组不重复的随机数。 在易语言中,这个过程可以用以下伪代码表示: ```易语言 定义 集合 已生成随机数集 {} 定义 整数 需要的随机数个数 = 10 循环 需要的随机数个数次 ....

    0-99的不重复随机数

    这个标题"0-99的不重复随机数"表明我们要讨论的是如何利用编程语言生成一个包含0到99所有整数且每个数只出现一次的随机序列。 描述中提到“代码很精简”,这可能是指实现该功能的代码行数较少,易于理解和实现。...

    产生不重复随机数算法

    本文将深入探讨一种在Java中实现的高效算法,该算法能够生成指定范围内的不重复随机数数组,特别适用于随机组题等应用场景。 ### 核心知识点解析 #### 1. 算法原理 算法的核心思想是首先创建一个包含指定范围内...

    易语言取随机数不重复源码.zip

    在易语言中,我们经常会遇到需要生成一组不重复随机数的需求,比如在制作抽奖程序或者模拟随机事件时。"易语言取随机数不重复源码.zip"这个压缩包文件显然包含了实现这一功能的源代码。 生成不重复随机数的关键在于...

    VB2012不重复的随机数

    以上就是VB2012中生成不重复随机数、排序以及查找最大值和最小值的完整过程。需要注意的是,当生成的随机数范围过大时,可能会导致循环运行时间过长,因此在实际应用中可能需要采用更高效的数据结构或算法,比如使用...

    c#产生随机数并冒泡排序

    下面是一个完整的C#程序示例,演示了如何使用随机数生成器生成随机数,并使用冒泡排序算法对数组进行排序: ```csharp using System; class Program { static void Main(string[] args) { int[] nums = new int...

    产生规定范围内的Excel随机数.rar

    然后,你可以结合LARGE函数来提取数组中的最大值,不断更新数组,直到达到所需数量的不重复随机数。 在实际操作中,可能会遇到性能问题,尤其是当目标范围非常大时。为了避免Excel因计算量过大而变慢,可以考虑分批...

    产生随机数

    在很多系统开发过程中,例如游戏开发或数据安全领域,都需要用到一组不重复的随机数。这些随机数可以用于生成唯一的ID、抽奖号码等。为了确保每次生成的随机数都是独一无二的,需要采取一定的策略来避免重复。 ####...

    易语言组合6位不重复数字源码

    总的来说,易语言组合6位不重复数字源码是一个很好的学习实例,它涵盖了算法设计、递归、回溯和数组操作等多个编程基础概念。通过分析和实现这个源码,开发者可以提升其在算法设计和易语言编程上的技能。

    javascript获取不重复的随机数的方法比较

    ### JavaScript 获取不重复随机数的方法比较 在JavaScript中,生成一系列不重复的随机数是一个常见的需求,尤其是在游戏开发、抽奖程序或数据处理等场景中。本文将详细介绍三种不同的方法来生成这种类型的随机数,...

    PHP产生不重复随机数的5个方法总结

    以下是对PHP产生不重复随机数的五种方法的详细解析: **方法一:基于数组的随机打乱** ```php $numbers = range(1, 50); shuffle($numbers); $num = 6; $result = array_slice($numbers, 0, $num); print_r($result...

    产生30个介于0至50之间的不同的随机数(VB)

    2. **数组处理**:数组是存储一组相同类型数据的容器,在本程序中,数组`C()`被用来存储生成的随机数。 3. **循环结构**:循环结构如`For`循环被用来控制程序流程,例如生成指定数量的随机数或对数组进行遍历操作...

    javascript 如何生成不重复的随机数

    接下来介绍一种更实用的方法,即生成一个特定范围内的不重复随机数数组,并按指定顺序排列。下面是一个使用递归来生成从大到小排列的随机数数组的例子: ```javascript function create(n) { var temp = Math....

    C#短时间内产生大量不重复的随机数

    3. **使用集合来跟踪已生成的随机数**:如果你需要生成一定范围内的所有不重复随机数,可以使用一个集合(如`HashSet&lt;int&gt;`)来存储已生成的随机数,每次生成新随机数时检查该集合,确保不与已有的随机数重复。...

    C++随机数生成(无关联随机数)

    在某些场景下,我们可能希望复现一组随机数,此时可以固定种子。例如,在测试或调试中,固定种子可以使每次运行得到相同的随机数序列: ```cpp std::mt19937 gen(1234); // 使用固定的种子 ``` 7. **并行生成...

    用两种语言实现的产生不重数的随机数代码

    两种语言的关键技术点在于如何生成不重复的随机数。这里使用了“旗标”(Flag)变量,当发现新生成的随机数已经在数组中时,设置`flag`为`True`,然后退出内部循环,重新生成一个新的随机数,直到找到一个未出现过的...

    Python产生一个数值范围内的不重复的随机数的实现方法

    总的来说,`random.sample()`是Python中生成不重复随机数的一个强大工具,它提供了简洁、高效的解决方案,适合各种需要无重复随机数的场合。通过深入理解和灵活运用,可以极大地丰富我们的程序设计和问题解决策略。

    易语言源码取不同随机数.rar

    综上所述,易语言中生成不重复随机数涉及到的主要知识点包括:随机数的生成、数据结构的应用、算法的选择以及循环和条件判断的使用。在编写代码时,要考虑到效率和内存使用,选择合适的方法来满足需求。

    C语言程序随机数的产生方法[参照].pdf

    对于不重复随机数的生成,一种常用的方法是使用集合或者数组来跟踪已生成的随机数,确保不会重复。例如,可以创建一个大小为10000的数组,每生成一个随机数,就将其填入数组的一个位置,直到所有位置都被填满。这样...

    VBA生成互不相同的随机数

    在循环中,每次生成一个随机数并检查是否已存在于数组或集合中,如果不存在则添加并继续生成下一个。以下是一个简单的示例: ```vba Sub GenerateUniqueRandoms() Dim randNum As Long Dim uniqueNumbers() As ...

Global site tag (gtag.js) - Google Analytics