C#的Random到底该怎么使用

先看代码:

在循环中,有的只NEW一个Random,有的每次都NEW 一个Random。

 1   Console.WriteLine("1.多个Random,默认随机种子,");
 2             for (int i = 1; i < 10;i++ )
 3             {
 4                 Random r1 = new Random();
 5                 int v = r1.Next(100);
 6                 Console.Write(v); Console.Write(" ");
 7                 System.Threading.Thread.Sleep(100);
 8             }
 9             Console.WriteLine("\n");
10
11             Console.WriteLine("2.多个Random,指定随机种子");
12             for (int i = 1; i < 10; i++)
13             {
14                 Random r2 = new Random(100);
15                 int v = r2.Next(100);
16                 Console.Write(v); Console.Write(" ");
17                 System.Threading.Thread.Sleep(100);
18             }
19             Console.WriteLine("\n");
20
21             Console.WriteLine("3.一个Random,默认随机种子");
22             Random r3 = new Random();
23             for (int i = 1; i < 10; i++)
24             {
25                 int v = r3.Next(100);
26                 Console.Write(v); Console.Write(" ");
27                 System.Threading.Thread.Sleep(100);
28             }
29             Console.WriteLine("\n");
30
31             Console.WriteLine("4.一个Random,指定随机种子");
32             Random r4 = new Random(100);
33             for (int i = 1; i < 10; i++)
34             {
35
36                 int v = r4.Next(100);
37                 Console.Write(v); Console.Write(" ");
38                 System.Threading.Thread.Sleep(100);
39             }
40             Console.WriteLine("\n");
41
42             Console.Read();

运行第一次结果:

运行第二次结果:

1.第二种情况中,产生的随机数为固定值
2.第四种情况中,每次产生的一组随机数为固定值.
3.第一和第三种,每次产生的都不相同.(默认随机种子).

查看MSDN,正好也阐述了为什么会出现第二和第四种情况.

如果同一个种子用于单独 Random 对象,则它们将生成相同的一系列随机数字。 这可以是用于创建测试套件,用于处理随机值,或者用于重播从随机数字派生其数据的游戏。 但请注意, Random 不同版本的.NET Framework 下运行的进程中的对象可能会返回不同的随机数字的序列,即使它们使用相同的种子值实例化.
若要生成的随机数的不同序列,您可以种子值依赖于时间,从而产生不同的系列的每个新实例 Random。 参数化 Random(Int32) 构造函数可以采用 Int32 值根据计时周期数以当前时间,而无参数 Random() 构造函数使用系统时钟生成其种子值。 不过,由于时钟具有有限的解决方法,使用无参数构造函数来创建不同 Random 中连续的对象创建生成的随机数的相同序列生成器。 下面的示例阐释了两个 Random 连续实例化的对象生成相同的一系列随机数字。 在大多数 Windows 系统, Random 在另一个 15 毫秒内创建的对象可能会遇到的相同种子值。

以前一直觉得出现第二种情况和第四种情况中,出现相同随机数是bug,知道今天我遇到如下情况,我发现这个还真是有用.
我写了一个程序,疯狂的制造随机数,往数据库里面直接插入数据.业务数据来自一些固定的客户端,某些客户端可能几天不会产生数据.为了使数据看起来更真实一些,就必须随机一些客户端不产生数据.
开始生成的不产生数据的客户端是随机的,譬如C1,c2,c3.N天后,变成两外的一批客户端不产生数据,譬如C1,C4,C6,C9.(用Timer在N天后触发).
但是这样有一个问题:当我的程序在N天之内被重启后,随机的客户端就变化了.达不到要求.我希望程序在N天内重启的时候,随机出的客户端list,不会变化
这时候,"生成相同的一系列随机数字"就派上用处了.
譬如下面,用这个方法来产生随机种子:

 1 private int SeedByDate()
 2 {
 3
 4 DateTime now = DateTime.Now.AddDays(4);
 5 DateTime dtbegin = new DateTime(DateTime.Now.Year, 1, 1);
 6
 7 int diffday = now.DayOfYear % 3;//3天一个循环
 8 DateTime result = dtbegin.AddDays(now.DayOfYear - diffday);
 9 return (int)result.Ticks;
10 }
时间: 2024-11-06 09:30:03

C#的Random到底该怎么使用的相关文章

与其想当然的 overdesign,不如自己动手做个试验

Conmajia Jan. 29th, 2019 早在2012年,我曾经针对 C# System.Random 不同的初始化方案专门做过一次试验,得出了单次默认初始化即可获得质量很好的随机数的结论.可是这么多年过去,C# 从2.0升到了4.7,还能在网上看到很多新手(甚至是老鸟)被一些想当然的奇怪思想误导,费时费力地脱裤子放屁. ▲ 万千被误导的灵魂 有些人总觉得用点额外的.生僻的玩意儿会显得很炫技,很厉害.正如修真小说里,稀有的古代神器多半比量产的现代装备牛逼,在编程的时候,用上那么几个不常用

java中的Random()函数

java中存在两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布. 在使用Math.Random()的时候需要注意的地方时该函数是返回double类型的值,所以在要赋值给其他类型的变量的时候注意需要进行塑形转换. 例子: 1 for(i=0;i<10;i++) 2 { 3

random函数

Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布. 例如下面的实验代码 编译通过后运行结果如下图 观察会发现代码的用一个循环10次循环输出num的取值,均随机分布在[0,3)之间!在使用Math.Random()的时候需要注意的地方时该函数是返回doubl

Java中 Random

Java中的Random()函数 (2013-01-24 21:01:04) 转载▼ 标签: java random 随机函数 杂谈 分类: Java 今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该

Java中的Random()函数

今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布. 例如下面的实验代码

linux 终端下敲ctrl-c时,到底发生了什么?(转)

通过telnet登录到单板,然后按ctrl-c会发生什么情况,流程是怎么样的? 在分析之前,先介绍tty的相关知识.我们可以认为,所有跟输入输出相关的操作,最终都由tty来接管.举例来说,当我们敲 ls /dev时得到 [cpp] view plaincopy ls /dev/ -l total 0 crw-------  1 root root     10, 235  8月 16 13:08 autofs drwxr-xr-x  2 root root         720  8月 16 

《游戏引擎全局光照技术》到底是一本什么样的书?

你可能觉得<游戏引擎全局光照技术>是另一本图形学理论知识科普读物,对不起,你错了!本文以问题的方式介绍该书的特点,更多信息的试读内容下载欢迎访问:http://www.thegibook.com 1. 这本书面向的读者群体是谁?本书面向所有需要了解计算机图形学中渲染相关原理的职位,包括游戏,影视动画,以及其它需要使用Unreal Engine等游戏引擎来处理工作的行业: 2. 这本书定位什么级别?中高级,这本书最核心的目的是帮助具备一定基础的读者系统地梳理各个庞杂的计算机图形学知识体系,如果您

随机森林(Random Forest)详解(转)

来源: Poll的笔记 cnblogs.com/maybe2030/p/4585705.html 1 什么是随机森林?   作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性.最初,我是在参加校外竞赛时接触到随机森林算法的.最近几年的国内外大赛,包括2013年百度校园电影推荐系统大赛.2014年阿里巴巴天池大数据竞赛

Java中的Random()函数-----转载

Java中的Random()函数 (2013-01-24 21:01:04) 转载▼ 标签: java random 随机函数 杂谈 分类: Java 今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该