典型算法及应用——关于产生不重复随机数的算法

时间:2021-01-30 09:50:03

我们不得不承认这样一个事实:那就是尽管在高级程序语言设计中包含了类似于Random产生随机数之类的方法,但是它产生的随机数并不能满足我们日常的需要,因为它可能重复——设想一下,电子化抽取试题的原理就是根据预定产生的题目数量产生果敢若干个对应的随机数,然后将匹配的试题抽取、排序并打印在试卷上。但是在同一次考试时候不允许同一题目出现重复(尽管这样的概率很低,但是我们绝对不允许这样做!)。所以避免产生重复随机数的方法(产生“真正的随机数”)成了我们必须研究的话题。今天本文就讨论一下。

产生不重复随机数的方法有很多——我倾向于“筛选法”(当然,这个方法是我在学习随机数时候突然想出来的,可能之前就有许多人早就有了这种思想)。 所谓“筛选法”就是根据要产生随机数指定的范围(起始数必须小于终止数),将这些数全部装入一个数组,然后利用系统随机函数(比如 Random )随机产生一个下标,将这个下标对应的数值返回并删除对应的这个数,直到这个数组为空。

下面给出VB.NET和C#对应的代码:

(VB.NET)

典型算法及应用——关于产生不重复随机数的算法典型算法及应用——关于产生不重复随机数的算法Public   NotInheritable   Class TureRandom
典型算法及应用——关于产生不重复随机数的算法    
Private nums As New ArrayList
典型算法及应用——关于产生不重复随机数的算法典型算法及应用——关于产生不重复随机数的算法    
Public Sub New(ByVal startnum As IntegerByVal 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() As Integer
典型算法及应用——关于产生不重复随机数的算法        
If (nums.Count <= 0Then
典型算法及应用——关于产生不重复随机数的算法            
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;
典型算法及应用——关于产生不重复随机数的算法            }

典型算法及应用——关于产生不重复随机数的算法    }

典型算法及应用——关于产生不重复随机数的算法
典型算法及应用——关于产生不重复随机数的算法}