几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数.
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()); }
这样就很清楚为什么上面把随机数放循环里面,输出来的是一样的,这主要是每次循环执行的时间可能一毫秒都没有,导致每次的去计算的值是一样的,这样就导致随机出来的数是一样的。
相关推荐
一旦定义好random()函数,就可以在需要的地方调用它来生成所需的随机数了。比如,我们想要生成10个1到100之间的随机数并打印出来,可以使用以下代码: ```javascript for (var i = 1; i ; i++) { console.log...
例如,你可以创建一个全局的随机数生成器,或者为每个需要随机数的地方创建一个局部的随机数生成器实例。使用`QRandomGenerator`生成0到6之间的随机数如下: ```cpp #include int randomNum = QRandomGenerator::...
Stopwatch是C#一个类似秒表的东西,用来计算程序的运行时间,注意,必须按照要求,计时器在程序运行时就要开启,在结束时停止并输出结果,不能放置在其他地方。 3)防伪码生成思路 例如,有以下定义: string ...
总的来说,混编编程结合了C语言的便捷性和汇编语言的效率,允许开发者在需要的地方直接控制硬件,实现特定的功能,例如在ARM架构中生成和操作随机数。通过熟练掌握内联汇编,开发者可以编写出更加高效且适应性强的...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库...注意,多线程编程需要特别关注同步和数据一致性问题,确保正确性和安全性。在实际项目中,还需要考虑线程安全、资源管理以及异常处理等因素。
如果在程序的多个地方需要生成随机数,记得只需在开始时设置一次种子即可。 总的来说,这三种方法各有优劣。`arc4random()` 是最方便且安全的选择,无需设置种子,适用于大部分情况。`CCRANDOM_0_1()` 适用于Cocos...
值得注意的是,如果不先调用`srand()`设置随机数种子,`rand()`会默认使用种子1,导致每次程序运行时生成相同的随机数序列,这对于需要不同随机数的行为是不利的。 `srand()`函数的作用是初始化随机数生成器的种子...
理解`shuffle`函数的使用和注意事项是编写涉及随机化处理代码的关键。 首先,我们要明确`shuffle`函数的一个重要特性:**它没有返回值**。这意味着当你调用`shuffle`后,不能像对待其他返回新对象的函数那样对结果...
确保在不同版本的LabVIEW中运行时,需要注意兼容性问题。 9. **调试和测试**:任何程序设计都包括调试和测试阶段,以确保功能正确性和性能优化。在掷骰子设计中,可以通过观察结果是否符合预期,验证随机数生成的...
根据提供的文件内容,我们可以从JavaSE实现的幸运抽奖...需要注意的是,由于文档内容是OCR扫描的结果,其中可能包含一些拼写错误和识别不清的地方,实际应用时应当对代码进行审查和调试,确保程序的准确性和稳定性。
根据提供的文件内容,可以提取以下知识点: 1. C语言文件操作:文件内容中涉及到C语言的文件操作函数...例如,文件中的代码片段有多处语法错误和不完整的地方,实际使用时需要进行调试和修正才能确保代码的正确运行。
现在自己实习小生的身份,将该博文的信息,整理成了Demo。希望对后来的探索者有一点点帮助。 在调试这个Demo时,懂得...大家一定要注意将网址改为自己的。 肯定有许多不恰当的地方,还请大家多多指教。qq:1162834643
请注意,实际应用中需要考虑更多安全因素,如密钥管理、错误处理和内存安全。在处理敏感数据时,应遵循最佳实践,如使用安全的随机数生成器、及时清理内存中的敏感信息等。 通过以上步骤,你可以在C++中实现AES CBC...
例如,我们可以用随机数设定小球的初始位置,使它们在窗口的不同地方出现;通过随机变化小球的运动速度,使得小球的运动轨迹更加自然和随机;还可以随机选择小球的颜色,让画面更显生动。 幻彩气球这个概念可能是指...
在使用这个函数时,开发人员需要注意几个关键点: - **性能**:生成GUID的过程可能会比简单的序列生成慢,因此在高并发环境中可能需要考虑性能影响。 - **唯一性**:虽然GUID理论上非常独特,但在极端情况下(如...
- 使用`Rnd`函数生成0到1之间的随机数,通过乘以范围(100-30+1)并加上最小值(30)来得到30-100的随机整数。 - 创建一个数组存储这些随机数,例如`Dim numbers(9) As Integer`,然后通过循环填充数组。 - 使用`...
在Win32控制台游戏开发中,还需要注意控制台的输入输出处理。使用`GetStdHandle`获取标准输入和输出句柄,然后用`WriteConsole`输出信息,`ReadConsole`读取用户输入。 总的来说,实现这个项目将涉及以下关键知识点...
1. **源码说明.txt**:这个文件通常会包含对源代码的简要介绍,包括主要功能、使用方法、注意事项以及可能存在的问题。开发者应当首先阅读此文件,以便快速了解源码的结构和工作原理。 2. **1-120Z40115300-L.png**...
注意,实际应用中需要对用户输入进行适当的错误处理和验证。 此外,为了提升用户体验,我们还可以添加一些视觉效果,比如用CSS改变正确答案或错误答案时的背景色,或者使用计时器显示剩余猜测次数。这可以通过操作...
在编程中,这可以通过使用C#的随机数生成器类Random来实现。我们需要定义一个数字范围,然后让Random类在这个范围内生成随机数,代表摇出的号码。 接下来,我们需要设计摇奖机的用户界面。C#提供了丰富的Windows ...