关于产生不重复随机数的算法
我们不得不承认这样一个事实:那就是尽管在高级程序语言设计中包含了类似于Random产生随机数之类的方法,但是它产生的随机数并不能满足我们日常的需要,因为它可能重复——设想一下,电子化抽取试题的原理就是根据预定产生的题目数量产生果敢若干个对应的随机数,然后将匹配的试题抽取、排序并打印在试卷上。但是在同一次考试时候不允许同一题目出现重复(尽管这样的概率很低,但是我们绝对不允许这样做!)。所以避免产生重复随机数的方法(产生“真正的随机数”)成了我们必须研究的话题。今天本文就讨论一下。
产生不重复随机数的方法有很多——我倾向于“筛选法”(当然,这个方法是我在学习随机数时候突然想出来的,可能之前就有许多人早就有了这种思想)。 所谓“筛选法”就是根据要产生随机数指定的范围(起始数必须小于终止数),将这些数全部装入一个数组,然后利用系统随机函数(比如 Random )随机产生一个下标,将这个下标对应的数值返回并删除对应的这个数,直到这个数组为空。
下面给出VB.NET和C#对应的代码:
(VB.NET)
Public NotInheritable Class TureRandomClass TureRandom
Private nums As New ArrayList
Public Sub New()Sub New(ByVal startnum As Integer, ByVal endnum As Integer)
If (startnum >= endnum) Then
Throw New Exception("对不起,起始数字必须小于结尾数字!")
Else
For i As Integer = startnum To endnum
nums.Add(i)
Next
End If
End Sub
Public Function GetNum()Function GetNum() As Integer
If (nums.Count <= 0) Then
Throw New Exception("对不起,指定范围的随机数全部产生过了。")
Else
Randomize()
Dim index As Integer = Rnd() * nums.Count
Dim returnnum As Integer = CType(nums(index), Integer)
nums.RemoveAt(index)
Return returnnum
End If
End Function
End Class
(C#)
public sealed class TureRandom
{
private ArrayList nums=new ArrayList();
public TureRandom (int startnum, int endnum)
{
if (startnum >= endnum)
throw new Exception("对不起,起始数字必须小于结尾数字!")
else
for (int i=startnum; i<=endnum;++i)
nums.Add(i);
}
public int GetNum()
{
if (nums.Count <= 0) Then
throw new Exception("对不起,指定范围的随机数全部产生过了。")
else
{
Random r = new Random();
int index=(int)(r.NextDouble()*10+1);
int returnnum =(int)(nums[index]);
nums.RemoveAt(index);
return returnnum;
}
}
}
分享到:
相关推荐
本文将深入探讨一种在Java中实现的高效算法,该算法能够生成指定范围内的不重复随机数数组,特别适用于随机组题等应用场景。 ### 核心知识点解析 #### 1. 算法原理 算法的核心思想是首先创建一个包含指定范围内...
在易语言中,生成不重复随机数是一项常见的需求,特别是在游戏开发、数据分析或者算法设计等场景。本文将深入探讨如何在易语言中实现取不重复随机数的功能。 首先,我们需要了解易语言中的随机数生成函数。在易语言...
总结来说,"取不重复随机数"是一个涵盖概率论、算法和数据结构等多个领域的IT知识主题,易语言的示例代码可以帮助我们更好地理解和实现这一功能。通过学习和实践,我们可以根据具体需求选择合适的方法生成不重复的...
### 生成不重复随机数的算法 在许多应用领域中,比如在线考试系统、游戏开发或是数据处理等场景,生成不重复的随机数是一项非常重要的技术。本文将详细介绍几种不同的方法来实现这一功能,并通过具体的Java代码示例...
根据提供的标题、描述以及部分代码内容,我们可以总结出在Visual Basic (简称VB)环境中生成不重复随机数的主要方法。此技术常用于各种场景,比如彩票系统、抽奖程序或需要无重复随机选择的应用。 ### 一、基本原理 ...
第三种方法涉及递归函数,用于生成指定范围内的不重复随机数。核心逻辑如下: 1. 初始化一个`Random`实例,用于生成随机数。 2. 创建一个整型数组`arrNum`,用于存储生成的随机数。 3. 在循环中,调用`getNum`函数...
在编程领域,生成1到N的不重复随机数是一个常见的需求,这在各种场景中都有应用,例如模拟抽奖、创建随机测试数据或者在游戏中分配资源等。这个任务涉及到两个主要的知识点:随机数生成和数组去重。 首先,我们来...
System.out.println("生成的十个不重复随机数为:"); for (int number : uniqueNumbers) { System.out.println(number); } } } ``` 在这个代码中,我们创建了一个`HashSet`来存储生成的随机数,然后在一个循环...
- 两种方法均能产生随机性较好的随机数序列,没有发现周期性的重复现象,符合随机数生成的基本要求。 - MATLAB的统计分析工具提供了有效的验证手段,能够直观地展示随机数的分布特征。 尽管如此,需要注意的是,RC4...
在IT领域,生成不重复的随机数序列是一个常见的需求,尤其是在需要进行随机抽样、数据模拟或游戏开发等场景中。下面将详细解析如何通过编程实现这一目标,并深入探讨其背后的算法逻辑和技术要点。 ### 核心知识点:...
在Keil C51开发环境中,生成随机数是嵌入式系统编程中常见的需求,尤其在游戏、加密算法、测试工具等领域。本文将详细介绍在Keil C51中如何使用标准库函数`rand()`和`srand()`来生成随机数,并通过实例代码进行演示...
在这个“一个简单的产生随机数并冒泡排序的算法”程序中,开发者可能将随机数生成与冒泡排序结合起来,生成一系列随机数,然后使用冒泡排序对这些随机数进行排序。11.c.exe可能是编译后的可执行文件,而11.c.sln则是...
以上就是VB2012中生成不重复随机数、排序以及查找最大值和最小值的完整过程。需要注意的是,当生成的随机数范围过大时,可能会导致循环运行时间过长,因此在实际应用中可能需要采用更高效的数据结构或算法,比如使用...
在JavaScript编程语言中,生成1到100之间不重复的随机数字是一项常见的需求,尤其在游戏、模拟或数据测试等场景中。...不过,上述解释已经涵盖了生成1到100之间不重复随机数的基本思路和常见实现方式。
对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。...
- `randperm(n)`:生成一个包含1到n之间不重复整数的随机排列。 - `normrnd(a, b, c, d)`:产生均值为a,标准差为b的正态分布随机矩阵,尺寸为c×d。 6. **内置函数与源代码**: - MATLAB的基本函数,如`rand`和...
在计算机科学和编程领域,随机数的生成是一个关键的组成部分,尤其在统计模拟、加密算法、...在解压并研究"随机数的产生"这个MATLAB程序后,将能更深入地理解这些概念,并可能发现更多关于优化和定制随机数生成的技巧。
在IT领域,随机数生成和仿真技术是计算机科学中的重要组成部分,特别是在...对于36选7的彩票开奖过程的模拟,关键是生成一系列不重复的随机数,这需要对数据结构和算法有深入的理解,以及熟练掌握汇编语言的编程技巧。
这可以通过`rng`函数的第二个参数实现,如`rng('shuffle')`使用快速但可能不完全随机的算法,`rng('twister')`则使用Mersenne Twister算法,一种高质量的随机数生成器。 8. **分布参数估计** 在实际应用中,我们...