如何获得真正的随机数?

4

可能的重复问题:
了解“随机性”
在C#中实现真正的随机数生成器的最快方法

你好。 功能:

Random rand = new Random();
rand.Next()

它基于秒的时间生成伪随机数。 如何获取真正的随机数? 我的意思是完全随机而不基于系统时间和某些算法。 例如,当你扔一个骰子时,你得到的是真正的随机数,而不是基于时间和任何算法。

您认为使用来自麦克风的短采样或鼠标位置变化之间的时间如何?


昨天刚刚讨论过:https://dev59.com/GW865IYBdhLWcg3wKLRP - user151323
2
在谷歌上搜索宇宙背景辐射,然后获取一个样本。 - leppie
这是什么语言?(抱歉我不太懂,假设是C#?) - richsage
4
要获得真正的随机数,你必须观察一个物理过程。 - Peter G.
2
将一个掷骰子设备和一个摄像头连接到您的计算机上。每次掷骰子时,使用图像识别来读取其点数。这样随机够吗? - MAK
显示剩余3条评论
9个回答

26

将一只猫与一瓶毒药放入盒子中,当单个放射性物质原子衰变时,毒药将被释放。一小时后回来并打开盒子。如果猫死了,在程序中使用0作为随机位;如果猫还活着,则使用1

根据需要重复使用尽可能多的猫和盒子。


+1 对虚拟猫的残忍行为! - Donal Fellows
哈哈哈哈..你真逗啊,兄弟!点赞! - Greg

7
您可以使用像random.org这样的服务。该服务可用于生成随机数。

5

让用户连续按几次空格键。使用击键间的微秒时间来初始化随机数生成器。

(或者更好的方法是,使用击键间的微秒时间与256微秒取模的余数来消除任何人类周期性,所以每个按键可以给你1个随机字节,使用适当数量的击键以初始化你的生成器)


@Anders:请不要在SO中使用tinyurl。 - MAK
我摇动鼠标来生成RSA密钥,这并不会真正困扰我。我想这取决于数字的数量和频率。人类实际上非常擅长生成随机数,因为我们无法精确地重复任何事情。这就是为什么人们仍然手工打磨望远镜镜面的原因。无论如何,考虑到OP没有提供有关他的系统的任何信息,我不确定你还能从哪里获得随机性,通用地说。 - Marc
1
针对您书摘中的特定点,显然您不应该要求用户输入随机种子,这也不是我在这里建议的。但如果这让您满意,除非您编写的应用程序根本不需要任何用户输入,否则可以使用UI其他部分的按键时间、鼠标移动等来初始化RNG,而不是专门要求输入一定数量的按键。 - Marc

5

大多数编程随机函数都基于数学算法。有些随机数生成器使用空气中的波浪噪声(来自太空辐射),但它们是硬件基础的。


5
为此,您需要一个硬件随机数生成器
对于大多数情况来说,这个替代品是通过测量“硬件事件”的时间,如用户输入或网络活动。
在Linux上,/dev/random设备基于此方法产生字节。

4

4
获取真正的随机数非常困难。毕竟,伪随机数生成器在某种程度上是可预测的。但是,基于物理源构建随机数生成器要正确得多;大多数随机源产生的实际随机位不够快,很难判断是否犯了严重错误。对于几乎所有目的,好的伪随机数生成器都更好。
只有在需要时才使用高质量的伪随机数生成器,因为它们速度较慢,并确保使用正确的类型:针对加密设计的PRNG与针对Monte Carlo模拟设计的PRNG不同-加密PRNG确保每个位都难以猜测,而MCSim PRNG确保谱特性良好-大多数其他PRNG用途只需要它们不会很差并且速度快;标准库中的PRNG通常足够好。

3

SO不应该提供软件解决方案吗?(认识到这里并没有一个好的纯软件解决方案) - Marc
抱歉,但我对这个 dongle 太着迷了,不得不分享... - Daniel Mošmondor

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接