.Net 真随机数

悲催,老是记不住真随机数怎么写,次次翻项目笔记,更悲催的是,在外面还翻不了项目笔记。。。。。。

在这里记一份好了,顺便分享给不懂的朋友们。

伪随机数相关的东西都不写了,神马测试,数据,截图,通通省略。好吧,心软,给一点点。

跑一遍就知道什么是伪随机数了:

    for (int i = 0; i < 1000; i++)
    {
      Console.WriteLine(new Random().Next(1, 1000));
    }

随便扯两句:伪随机数之所以会重复,是因为随机数方法默认以时间为随机种子,而在编程里,时间精度终究有限,短时间内多次取出时间,这个时间值就可能重复,

时间(随机数种子)重复了,随机数自然也重复。所以我们的解决思路就是提供一个永不重复的随机数种子。

上代码:

获取强随机数种子

        /// <summary>
        /// 描 述:创建加密随机数生成器 生成强随机种子
        /// </summary>
        /// <returns></returns>
        static int GetRandomSeed()
        {
            byte[] bytes = new byte[4];
            System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
            rng.GetBytes(bytes);
            return BitConverter.ToInt32(bytes, 0);
        }

使用方法:

int ranNumer = new Random(GetRandomSeed()).Next(numMin, numMax);

PS:方法二

刚刚说为什么会重复的时候,我突然想到,以时间为随机数种子,短时间内我不让它取那么多次,不就可以避免重复了?

试了一下:

            for (int i = 0; i < 1000; i++)
            {
                Thread.Sleep(1);//强制停止一毫秒
                Console.WriteLine(new Random().Next(1, 1000));
            }

果然不重复了,我果真机智~~  *^_^*

时间: 2024-12-04 14:22:08

.Net 真随机数的相关文章

一、解密随机数生成器(1)——真随机数生成器(转)

解密随机数生成器(1)--真随机数生成器 从小就一直很好奇,MP3播放器的随机播放功能是如何实现的,今天读到一篇关于随机数的文章,又勾起了我的那时好奇心,索性上下求索,了解了随机数背后的很多知识,顿觉豁然开朗,特意写这篇文章和大家总结分享一下. 其实,随机数在我们身边无处不在.无论是玩扑克牌麻将骰子时的点数,玩LOL时的玩家匹配,还是高大上的量子物理,核聚变,都无一例外地随机数有关,在混沌理论中,这个世界本身就是一系列随机过程的产物--好吧,有点激动,扯得太远了--作为编程爱好者,应该会发现,每

C-Xcode真随机数的产生, 指针基础, 小技巧

小技巧1: 输出一个 % 输出一个%号(因为%是格式控制符的符号,所以输出是单独写一个%,系统会默认把%与其后面一个字符相结合当做格式控制符) —— %% 小技巧2: 自动整理代码 整理代码组合键 选中要对齐的代码 control + i 就会自动对齐 前提:代码没有语法错误 小技巧3: 产生一个真随机数 产生一个指定范围内的随机数: 比如需求:产生10-20的随机数 int num = arc4random_uniform(11) + 10 其他类推可得 公式 int num = arc4ra

从Linux内核中获取真随机数【转】

转自:http://www.cnblogs.com/bigship/archive/2010/04/04/1704228.html 内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这个随机数产生器产生的是真随机数.与标准C库中的rand(),srand()产生的伪随机数不同,尽管伪随机数带有一定的随机特征,但这些数字序列并非统计意义上的随机数.也就是说它们是可重现的--只要每次使用相同的seed值,就能得到相同的伪随机数列.通常通过使用time()的返回值来改变seed,以此得

Linux真随机数的生成

今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace std; #include<unistd.h> #include<fcntl.h> #include<cmath> int main() { int randoms=open("/dev/random",O_RDONLY); int randomn; rea

真随机数,随机数辅助类

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Linq; public static class RandomHelper { // 默认生成一个自动分配随机种子的随机数生成器 private static System.Random globalRandomGenerator = CreateRandom(); /// <summ

quick 均衡真随机数

math.randomseed(tostring(os.time()):reverse():sub(1, 6)) local sum1=0 local sum2=0 local sum3=0 local sum4=0 for i=1,100 do local num=math.random(1,4) if math.ceil(num)==1 then sum1=sum1+1 end if math.ceil(num)==2 then sum2=sum2+1 end if math.ceil(nu

随机数是骗人的,.Net、Java、C为我作证

差点儿全部编程语言中都提供了"生成一个随机数"的方法,也就是调用这种方法会生成一个数,我们事先也不知道它生成什么数.比方在.Net中编写以下的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 执行后结果例如以下: Next()方法用来返回一个随机数.相同的代码你执行和我的结果非常可能不一样,并且我多次执行的结果也非常可能不一样,这就是随机数. 一.陷阱 看似非常easy的东西,使用的时候有陷阱.我编写以下的代码

随机数是骗人的,.Net、Java、C为我作证(转载)

几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下: Next()方法用来返回一个随机数.同样的代码你执行和我的结果很可能不一样,而且我多次运行的结果也很可能不一样,这就是随机数. 一.陷阱 看似很简单的东西,使用的时候有陷阱.我编写下面的代码想生成100个随

随机数大揭秘

参考文章:杨中科老师的<随机数是骗人的,.Net.Java.C为我作证> http://www.cnblogs.com/rupeng/p/3723018.html#!comments 1.随机数的原理: "线性同余法":  第n+1个数=(第n个数*29+37) % 1000 2.写一个自己的random 1 static void Main(string[] args) 2 { 3 MyRandom mr = new MyRandom(8);//相同的种子,每次都会生成相