`
zxlyecf2
  • 浏览: 129615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用随机数需要注意的地方

    博客分类:
  • C#
阅读更多

几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数.

 

  Random rand = new Random();
            Console.WriteLine(rand.Next());
            Console.ReadLine();

 结果:

 看似很简单的东西,使用的时候有陷阱。我编写下面的代码想生成100个随机数:

 

 

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

 结果会让你大吃一惊:



 为什么随机出来的数很多都是一样呢?再看看下面这个方法:

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

 

 这样写就正常了,这要从计算机中"随机数"产生的原理说起了。我们知道,计算机是很严格的,在确定的输入条件下,产生的结果是唯一确定的,不会每次执行的结果不一样。那么怎么样用软件实现产生看似不确定的随机数呢?

 

    生成随机数的算法有很多种,最简单也是最常用的就是 "线性同余法":  第n+1个数=(第n个数*29+37) % 1000,其中%是"求余数"运算符。很多像我一样的人见了公式都头疼,我用代码解释一下吧,MyRand是一个自定义的生成随机数的类:

class MyRand
 { 
    private int seed; 
    public MyRand(int seed) 
   { 
    this.seed = seed; 
   } 
 
  public int Next() 
   { 
     int next = (seed * 29 + 37) % 1000; 
     seed = next; 
     return next; 
  } 
 
} 
 如下调用:

MyRand rand = newMyRand(51); 
for (int i = 0; i < 10; i++) 
 { 
    Console.WriteLine(rand.Next()); 
 }

 我们创建MyRand的一个对象,然后构造函数传递一个数51,这个数被赋值给seed,每次调用Next方法的时候根据(seed * 29 + 37) % 1000计算得到一个随机数,把这个随机数赋值给seed,然后把生成的随机数返回。这样下次再调用Next()的时候seed就不再是51,而是上次生成的随机数了,这样就看起来好像每一次生成的内容都很"随机"了。注意"%1000"取余预算的目的是保证生成的随机数不超过1000。 

 

当然无论是你运行还是我每次运行,输出结果都是一样的随机数,因为根据给定的初始数据51,我们就可以依次推断下来下面生成的所有"随机数"是什么都可以算出来了。这个初始的数据51就被称为"随机数种子",这一系列的516、1、66、951、616……数字被称为"随机数序列"。

 

 那么怎么可以使得每次运行程序的时候都生成不同的"随机数序列"呢?因为我们每次执行程序时候的时间很可能不一样,因此我们可以用当前时间做"随机数种子"

MyRand rand = newMyRand(Environment.TickCount); 
for (int i = 0; i < 10; i++) 
 { 
    Console.WriteLine(rand.Next()); 
 }

 这样就很清楚为什么上面把随机数放循环里面,输出来的是一样的,这主要是每次循环执行的时间可能一毫秒都没有,导致每次的去计算的值是一样的,这样就导致随机出来的数是一样的。

  • 大小: 3.1 KB
  • 大小: 4.4 KB
  • 大小: 4.5 KB
分享到:
评论

相关推荐

    C# 控制台应用程序——随机数

    Stopwatch是C#一个类似秒表的东西,用来计算程序的运行时间,注意,必须按照要求,计时器在程序运行时就要开启,在结束时停止并输出结果,不能放置在其他地方。 3)防伪码生成思路 例如,有以下定义: string ...

    C语言随机数

    介绍了如何用库函数取随机数,rand()和srand()是如何使用,以及需要注意的地方。

    在python3中使用shuffle函数要注意的地方

    今天小编就为大家分享一篇在python3中使用shuffle函数要注意的地方,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Android操作HTTP实现与服务器通信

    现在自己实习小生的身份,将该博文的信息,整理成了Demo。希望对后来的探索者有一点点帮助。 在调试这个Demo时,懂得...大家一定要注意将网址改为自己的。 肯定有许多不恰当的地方,还请大家多多指教。qq:1162834643

    delphi 开发经验技巧宝典源码

    0221 当ADO循环删除数据时需要注意的问题 147 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 ...

    delphi 开发经验技巧宝典源码06

    0221 当ADO循环删除数据时需要注意的问题 147 0222 把Excel中的数据保存到数据库中 147 0223 怎样弹出ConnectionString设置页 148 0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 ...

    xdd.github.io:个人知识体系笔记

    配置文件csv配置文件与csv对象ini配置文件与ConfigParser对象json配置文件与json对象Messagepack序列化传输其他random随机数datetime时间模块的使用python常用模块简介PEP-Python规范python重点注意地方1.2、Python...

    C语言难点分析整理

    32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左...

    HGE_系列教材(1-9)

    2)通常游戏资源(Game Resources)需要使用HGE 创作工具来产生 3. 体系结构概述: 1)Core Functions 层 &lt;1&gt; 图形格式支持:支持BMP, JPG, PNG, TGA, DDS, DIB 文件格式 &lt;2&gt; 支持窗口模式和全屏模式 &lt;3&gt; 音频支持和...

    BlockChainDemo:用golang实现的第一个区块链

    BlockChainDemo 用golang实现的第一个区块链 计划完成时间是三天 12/16 现在能够实现的只是私有链,另外只是用到了hash那些,完全没有...初步完成了区块的pow共识机制,需要注意的地方是nonce部分的随机数需要加种子

    你必须知道的495个C语言问题

    5.11 我曾经使用过一个编译器,不使用NULL就不能编译。 5.12 我用预处理宏#defineNullptr(type)(type*)0帮助创建正确类型的空指针。 回顾 59 5.13 这有点奇怪:NULL可以确保是0,但空(null)指针却不一定? ...

    labview实验报告(2).doc

    乘法器和随机数发生器由Functions»Numeric中拖出,尽管数值常数也可以这样得到 ,但是建议使用在连接端子处点击右键创建(Create)常量(Constant)的方法更好些 。 8)用连线工具将各对象按规定连接。 9)选择 ...

    软件课程设计 试验报告 代码 演示

    在调试过程中程序使用"rand()%10"或"rand()%100" 获得的随机数往往不随机,即获得的随机数不变,经过查阅资料和详细分析,原来它需要初始化。 1.5 用户使用说明: 友好的程序界面给人一种亲切感,整个程序使用...

    LINGO软件的学习

    一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。 2.3.1 定义原始集 为了定义一个原始集,必须详细声明: •集的名字 •可选,集的成员 •可选,集成员的属性 定义一...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程中的所有...

    C语言FAQ 常见问题列表

    o 6.8 但是如果 NULL 的值改变了, 比如在使用非零内部空指针的机器上, 难道用 NULL (而不是 0) 不是更好吗? o 6.9 用预定义宏 #define Nullptr(type) (type *)0 帮助创建正确类型的空指针。 o 6.10 这有点奇怪。...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

Global site tag (gtag.js) - Google Analytics