`
zxlyecf2
  • 浏览: 133118 次
  • 性别: 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
分享到:
评论

相关推荐

    js生成1到100的随机数最简单的实现方法

    一旦定义好random()函数,就可以在需要的地方调用它来生成所需的随机数了。比如,我们想要生成10个1到100之间的随机数并打印出来,可以使用以下代码: ```javascript for (var i = 1; i ; i++) { console.log...

    Qt里产生随机数.doc

    例如,你可以创建一个全局的随机数生成器,或者为每个需要随机数的地方创建一个局部的随机数生成器实例。使用`QRandomGenerator`生成0到6之间的随机数如下: ```cpp #include int randomNum = QRandomGenerator::...

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

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

    ARM和C语言混编实现随机数的加减

    总的来说,混编编程结合了C语言的便捷性和汇编语言的效率,允许开发者在需要的地方直接控制硬件,实现特定的功能,例如在ARM架构中生成和操作随机数。通过熟练掌握内联汇编,开发者可以编写出更加高效且适应性强的...

    MFC进程产生20个线程产生随机数求平均值

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库...注意,多线程编程需要特别关注同步和数据一致性问题,确保正确性和安全性。在实际项目中,还需要考虑线程安全、资源管理以及异常处理等因素。

    objective-c中生成随机数的方法

    如果在程序的多个地方需要生成随机数,记得只需在开始时设置一次种子即可。 总的来说,这三种方法各有优劣。`arc4random()` 是最方便且安全的选择,无需设置种子,适用于大部分情况。`CCRANDOM_0_1()` 适用于Cocos...

    c++中的随机函数(rand,sand)的用法[转载][文].pdf

    值得注意的是,如果不先调用`srand()`设置随机数种子,`rand()`会默认使用种子1,导致每次程序运行时生成相同的随机数序列,这对于需要不同随机数的行为是不利的。 `srand()`函数的作用是初始化随机数生成器的种子...

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

    理解`shuffle`函数的使用和注意事项是编写涉及随机化处理代码的关键。 首先,我们要明确`shuffle`函数的一个重要特性:**它没有返回值**。这意味着当你调用`shuffle`后,不能像对待其他返回新对象的函数那样对结果...

    基于LABVIEW掷骰子设计

    确保在不同版本的LabVIEW中运行时,需要注意兼容性问题。 9. **调试和测试**:任何程序设计都包括调试和测试阶段,以确保功能正确性和性能优化。在掷骰子设计中,可以通过观察结果是否符合预期,验证随机数生成的...

    JavaSE实现幸运抽奖系统.pdf

    根据提供的文件内容,我们可以从JavaSE实现的幸运抽奖...需要注意的是,由于文档内容是OCR扫描的结果,其中可能包含一些拼写错误和识别不清的地方,实际应用时应当对代码进行审查和调试,确保程序的准确性和稳定性。

    计算机二级c语言机试真题.pdf

    根据提供的文件内容,可以提取以下知识点: 1. C语言文件操作:文件内容中涉及到C语言的文件操作函数...例如,文件中的代码片段有多处语法错误和不完整的地方,实际使用时需要进行调试和修正才能确保代码的正确运行。

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

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

    C++ AES cbc加密 带iv向量 绝对可用

    请注意,实际应用中需要考虑更多安全因素,如密钥管理、错误处理和内存安全。在处理敏感数据时,应遵循最佳实践,如使用安全的随机数生成器、及时清理内存中的敏感信息等。 通过以上步骤,你可以在C++中实现AES CBC...

    易语言窗口弹小球

    例如,我们可以用随机数设定小球的初始位置,使它们在窗口的不同地方出现;通过随机变化小球的运动速度,使得小球的运动轨迹更加自然和随机;还可以随机选择小球的颜色,让画面更显生动。 幻彩气球这个概念可能是指...

    ZLXA_GUID.zip

    在使用这个函数时,开发人员需要注意几个关键点: - **性能**:生成GUID的过程可能会比简单的序列生成慢,因此在高并发环境中可能需要考虑性能影响。 - **唯一性**:虽然GUID理论上非常独特,但在极端情况下(如...

    第一套操作题题目

    - 使用`Rnd`函数生成0到1之间的随机数,通过乘以范围(100-30+1)并加上最小值(30)来得到30-100的随机整数。 - 创建一个数组存储这些随机数,例如`Dim numbers(9) As Integer`,然后通过循环填充数组。 - 使用`...

    实现一个能模拟简单猜扑克牌大小的 Win32 控制台游

    在Win32控制台游戏开发中,还需要注意控制台的输入输出处理。使用`GetStdHandle`获取标准输入和输出句柄,然后用`WriteConsole`输出信息,`ReadConsole`读取用户输入。 总的来说,实现这个项目将涉及以下关键知识点...

    Android Fireworks烟花效果源码.zip

    1. **源码说明.txt**:这个文件通常会包含对源代码的简要介绍,包括主要功能、使用方法、注意事项以及可能存在的问题。开发者应当首先阅读此文件,以便快速了解源码的结构和工作原理。 2. **1-120Z40115300-L.png**...

    javascript经典特效---猜物品所在地方.rar

    注意,实际应用中需要对用户输入进行适当的错误处理和验证。 此外,为了提升用户体验,我们还可以添加一些视觉效果,比如用CSS改变正确答案或错误答案时的背景色,或者使用计时器显示剩余猜测次数。这可以通过操作...

    摇奖机源玛学习

    在编程中,这可以通过使用C#的随机数生成器类Random来实现。我们需要定义一个数字范围,然后让Random类在这个范围内生成随机数,代表摇出的号码。 接下来,我们需要设计摇奖机的用户界面。C#提供了丰富的Windows ...

Global site tag (gtag.js) - Google Analytics