C#中的 new Random()

在C#中,产生随机数常用大方法是 new Random().Next(1,10)等方法。

但是仔细发现会有个问题:

看代码:

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

          Console.ReadKey(); 

运行结果:

发现随机的数基本都是一样的。就有问题了,每次随机的都是一样的,就不是随机数了。

仔细查看 Random的构造函数

public Random() : this(Environment.TickCount)
        {
        }
        /// <summary>Initializes a new instance of the <see cref="T:System.Random" /> class, using the specified seed value.</summary>
        /// <param name="Seed">A number used to calculate a starting value for the pseudo-random number sequence. If a negative number is specified, the absolute value of the number is used. </param>
        [__DynamicallyInvokable]
public Random(int Seed)
        {
            int num = (Seed == -2147483648) ? 2147483647 : Math.Abs(Seed);
            int num2 = 161803398 - num;
            this.SeedArray[55] = num2;
            int num3 = 1;
            for (int i = 1; i < 55; i++)
            {
                int num4 = 21 * i % 55;
                this.SeedArray[num4] = num3;
                num3 = num2 - num3;
                if (num3 < 0)
                {
                    num3 += 2147483647;
                }
                num2 = this.SeedArray[num4];
            }
            for (int j = 1; j < 5; j++)
            {
                for (int k = 1; k < 56; k++)
                {
                    this.SeedArray[k] -= this.SeedArray[1 + (k + 30) % 55];
                    if (this.SeedArray[k] < 0)
                    {
                        this.SeedArray[k] += 2147483647;
                    }
                }
            }
            this.inext = 0;
            this.inextp = 21;
            Seed = 1;
        }

无参的构造函数其实调用的是 有参的构造函数,传递的 默认值: Environment.TickCount

System.Environment.TickCount 获取开机时间函数。

也就是说每次传递进去的都是一样的值。

如果我们,改下代码,给 new Random()传参.

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

这次的运行结果:

明显的不一样了。就是随机的效果了。

还有一种方式也可以实现随机的效果:

     Random rnd = new Random(); //在外面生成对象
            for (int i = 0; i < 10;i++ )
            {
                Console.WriteLine(rnd.Next(1, 10)); //调用同一个 对象产生随机数。
            }

运行结果:

也可以实现随机的效果。

时间: 2024-10-09 07:44:23

C#中的 new Random()的相关文章

python3在pycharm中为什么导入random模块不能用? TypeError: &#39;module&#39; object is not callable

新手学python求大神指导,也用sys导入了random.py的路径,仍然不行. 刚刚排错貌似找到了问题的原因...那是因为我在pycharm中新建的python文件名就是random,所以当前目录下就有一个random.py文件而且是自己写的,所以它在sys.path中会先找到自己定义的random.py并调用之,因为自己的什么都没有,所以就呵呵了:改了文件名字后就ok了 要多注意文件名这种情况,有时候文件名与系统的模块重名了,就出这种莫名其妙的错,也不方便查错 python3在pychar

Java中生成随机数Random、ThreadLocalRandom、SecureRandom、Ma

我们来说说Java常见的生成随机数的几种方式:Random,ThreadLocalRandom,SecureRandom;其实产生随机数有很多种方式但我们常见的就这几种,如果需要详细了解这个三个类,可以查看JAVA API. Random random = new Random(); int a = random.nextInt(5);//随机生成0~4中间的数字 其实Random是有构造函数的,他的参数可以传一个long类型的值,当使用空的构造的时候,使用的实际上是System.nanoTim

C/C++ 中rand()和random()函数

nt rand(void); 返回一个随机数0 ~ pow(2, sizeof(int))-1long int random(void); 返回一个随机数0 ~ pow(2, sizeof(long int))-1 void srand(unsigned int seed); 设置rand函数的种子void srandom(unsigned int seed); 设置random函数的种子 注意: 1.rand和random的区别就是返回类型不同,int和long int(虽然在普通的32位机上

Python中模块之random的功能介绍

random的功能介绍 random模块的方法如下: betavariate 获取一个range(0,1)之前的随机浮点数 方法:random.betavariate(alpha,beta) 返回值:float 例如:print(random.betavariate(3,4)) >>> 0.4179835782470355 #该方法需要两个参数都大于0才会执行,即两个参数类型需要是数值类型. choice 随机获取非空序列的元素 方法:random.choice(seq) 返回值:obj

Java中利用Math.random()产生服从泊松分布的随机数

众所周知.Java的Math.random()产生的是服从均匀分布的随机数,可是其它分布的应用也相当广泛,比如泊松分布和高斯分布(正态分布).而这些分布Java没有非常好的提供(高斯分布能够利用Random类),我们须要自己编写. 首先是泊松分布,这是一个离散型的随机变量分布.比較好弄,此外比如考察一些到达事件的概率时,通常服从泊松分布,因此该分布相当有用.在開始编写之前,先感谢知乎一位大神的科普知识.如果有一个服从均匀分布的随机变量.u~U[0,1],F(x)为随机变量x的累计分布函数,那么F

java中Random随机种子使用

在java中,通过Random生成随机数时,如果设置随机种子,则相同的种子,产生的随机数相同.若不设置则每次随机的不同. Random rnd = new Random(); rnd.setSeed(10);//用于设置种子. rnd.nextInt();// 用于产生随机数. rnd.nextInt(10); // 产生(0-9)数字.

Loadrunner中参数化实战(6)-Random+Each occurrence

参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Random+Each occurrence 设置迭代4次Action 结果如下:

Java中Math.random()的应用(随机生成数的应用)

<1>随即范围Java中a=Math.random()的取值范围为0<=a<=1 由此可得a=Math.random()*n的取值范围是0<=a<=n <2>实际应用 对于要求随机输出一个大写字母 char ss=(char)(int)(26*(Math.random())+65);//表示随机一个大写字母 System.out.println(""+ss); 对已要求随机输出一个小写字母 char es=(char)(int)(26*(

C++中的随机数函数(

标签:ul 随机数 c 整数 max 教育  C++中产生随机数种子对于刚開始学习的人一直都非常困惑.大家知道,在C中有专门的srand(N)函数能够轻松实现这一功能,然而在C++中则要复杂一些.以下是笔者学习的一点心得,希望对大家能有所帮助.(这里我们依旧要借助C标准库中的rand()函数) 函数说明: int rand();                                          :返回从[0,MAX)之间的随机整数,这里的MAX与你所定义的数据类型而定:需#inc