我是靠谱客的博主 还单身萝莉,最近开发中收集的这篇文章主要介绍C# 产生真正随机数的方法,可以高速连续调用也能随机(测试过的代码实例,可复制直接使用),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在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# 产生真正随机数的方法,可以高速连续调用也能随机(测试过的代码实例,可复制直接使用)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部