概述
在C#编程的时候,经常会遇到需要用到随机数,而如果只是简单调用 Random,所产生的实际不是随机数,当调用过快,或者程序连续调用时,通常产生“固定”的数。经过摸索与测试,我一般会自己写一个函数,可以保证在任何一次调用,都最大概率产生真正的随机数,代码如下,可以直接使用哦:
private int GetRandomInAB(int minA, int maxB) //在A到B的区间随机取值返回,如果B小于等于A,或溢出,返回-1
{
int iRandomBack = -1; //防溢出,固定回传
if (maxB > minA) //B大于A
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); //采用 RNGCryptoServiceProvider取随机数
rng.GetBytes(bytes);
int Randseed = BitConverter.ToInt32(bytes, 0); //产生一个随机种子
string strTick = Convert.ToString(DateTime.Now.Ticks); //采用DateTime.Now.Ticks取随机数
if (strTick.Length > 8)
strTick = strTick.Substring(strTick.Length - 8, 8); //绝大部分情况,tick后面的8位数字才是变动的,前面不变舍去
Randseed = Randseed + Convert.ToInt32(strTick); //第二个随机种子,加上第一个随机种子
Random random = new Random(Randseed);
iRandomBack = random.Next(minA,maxB);
}
return iRandomBack; //2020-08-25 经测试,快速调用,依然随机性好
}
额外的一些说明:
(1) system.Security.Cryptography.RNGCryptoServiceProvider的类,它采用系统当前的硬件信息、进程信息、线程信息、系统启动时间和当前精确时间作为填充因子,通过更好的算法生成高质量的随机数
(2)DateTime.Now.Ticks,是以系统时间为准,返回所获得的是 毫微妙 级别的时间单位值,所以一般取后面8位,前面 年 月 日 小时 分钟 等在程序调用的一小片时间内,一般是不变的
(3)以上2种方法,可以只采用其中一种,但是以2者之和来作为随机种子,从而产生的随机数更随机;
最后
以上就是还单身萝莉为你收集整理的C# 产生真正随机数的方法,可以高速连续调用也能随机(测试过的代码实例,可复制直接使用)的全部内容,希望文章能够帮你解决C# 产生真正随机数的方法,可以高速连续调用也能随机(测试过的代码实例,可复制直接使用)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复