A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 关关雎鸠 于 2013-6-27 19:06 编辑

问:
用C#如何在1到1000中随机获取20个数?

一般都这样写:
Random ra = new Random();

for (int i = 0; i < 20; i++)

{

       int a=ra.Next(1,1001);

       Console.WriteLine(a);

}
输出的就是20个随机数。

----------------------------

不过我最开始的时候不是这样写:
for(int i = 0; i < 20; i++) {
       Random ran = new Random();
       int num = ran.Next(1, 1001);
       Console.WriteLine(num);
}
运行后发现一个有意思的事……

看到没,是20个一模一样的数字。刚开始以为哪儿写错了,但是代码没有任何问题啊。于是我连续运行很多遍,发现并不是每次都是一样的,偶尔有那么一两次20个数字中出现其它的数字(但不是很多)。

于是,我调试一下,又发现:调试的结果与直接运行的结果完全是两种结果,调试最终出来的是比较“理想”的随机数……

这是神马情况?

-------------------------------

当然我知道,每次循环的时候都会创建一个Random对象,但是这样做并没有与题目相违背(也是创建随机数),但是出来的并不是理想的随机数。并且,为什么调试出来的是“理想的”,但是直接运行的却大多一样呢?

1.png (11.13 KB, 下载次数: 0)

1.png

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

6 个回复

倒序浏览
其实Random随机函数本是就一种伪随机数,伪随机数是以相同的概率从一组有限的数字中选取的。 所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的。随机数的生成是从种子值开始。 如果反复使用同一个种子,就会生成相同的数字系列。 产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
菜鸟励志要逆袭 发表于 2013-6-27 11:24
其实Random随机函数本是就一种伪随机数,伪随机数是以相同的概率从一组有限的数字中选取的。 所选数字并不 ...

反复使用同一个种子怎么理解?
每次new一个Random难道是同一个?

还有种子值域时间相关,能解释调试与直接运行表现的结果不一样吗?
回复 使用道具 举报
随机数的生成是从种子值开始。 如果反复使用同一个种子,就会生成相同的数字系列。 产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。 默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值。 但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。 下面的示例演示两个连续实例化的 Random 对象生成相同的随机数序列。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 菜鸟励志要逆袭 于 2013-6-27 12:17 编辑

zzzzzzzzzz
回复 使用道具 举报
本帖最后由 274997322 于 2013-6-27 14:57 编辑

电脑没有真正的随机
他是依赖于当前时间做伪随机
当前时间 再累积一个值
如果放在循环里  循环执行非常快 则当前时间相同 算法和累积也相同 所以会造成值相同
你把代码多执行几次,就可以看出 ,随机值是和 当前时间 挂钩的
当期时间是相同的 每次都新建一个Random ,算法和累计值也是相同的,所以得出来的结果也一样
当for循环执行多次时候 当前时间改变,就会得出不同的结果了


QQ截图20130627145154.jpg (150.73 KB, 下载次数: 0)

QQ截图20130627145154.jpg
回复 使用道具 举报
我还是自己去看MSDN,你们说的感觉不是那回事。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马