如何在不维护内部状态的情况下生成高质量的随机数?
How do I produce quality random numbers without maintaining internal state?
通常,您会在应用程序启动时使用种子(通常是时间)初始化某种随机数生成器对象,然后将其保留并向其请求随机数。这个对象就是状态。
我有一个应用程序启动,生成一个数字,然后退出。由于RNG是从时钟初始化的,所以我还是有一些随机性的,但是框架提供的标准RNG并不是要这样使用的(询问每个种子的第一个数字),所以生成的数字质量很差。如何在我的应用程序调用之间不保存 RNG 状态的情况下生成高质量随机数?
如果重要的话,我会在 Windows 上执行此操作。获得额外的随机源是可以的,但不允许留下数据(例如写入磁盘)。
在 Windows 上有一个安全的随机生成器 CryptGenRandom
,它将为您完成所有这些工作。大多数语言都有 SecureRandom
class、dev/random
或类似的方式来访问它。其他 OS 也会有类似的安排。基本上他们从系统内部导入熵来播种他们自己的发电机。
对于更通用的解决方案,您可以在卡上使用硬件 RNG,例如
Quantis RNG.
通常,您会在应用程序启动时使用种子(通常是时间)初始化某种随机数生成器对象,然后将其保留并向其请求随机数。这个对象就是状态。
我有一个应用程序启动,生成一个数字,然后退出。由于RNG是从时钟初始化的,所以我还是有一些随机性的,但是框架提供的标准RNG并不是要这样使用的(询问每个种子的第一个数字),所以生成的数字质量很差。如何在我的应用程序调用之间不保存 RNG 状态的情况下生成高质量随机数?
如果重要的话,我会在 Windows 上执行此操作。获得额外的随机源是可以的,但不允许留下数据(例如写入磁盘)。
在 Windows 上有一个安全的随机生成器 CryptGenRandom
,它将为您完成所有这些工作。大多数语言都有 SecureRandom
class、dev/random
或类似的方式来访问它。其他 OS 也会有类似的安排。基本上他们从系统内部导入熵来播种他们自己的发电机。
对于更通用的解决方案,您可以在卡上使用硬件 RNG,例如 Quantis RNG.