我正在学习 C 语言中的随机数生成。在探索不同的方法时,我想到了使用内存地址作为随机数生成器(如 rand())的种子的想法。但是,我不确定这是否是一个好的做法。
这是我的问题:
为什么不建议使用内存地址作为 rand() 的种子? 这种方法是否存在安全问题或限制? 在 C 中播种随机数生成器的首选方法是什么? 会起作用吗?
附加信息:
我知道 rand() 是一个伪随机数生成器,但我对种子方面特别感兴趣。 如果不鼓励使用内存地址,是否有其他方法可以出于(非关键)目的从它们中提取一些随机性?
我一直在做一个基本项目来熟悉 C 中的随机数,这个问题是在探索不同的播种方法时出现的。 在这里我试图用 rand() 获取随机数
#include<stdio.h>
int main(){
int num=1;
int *ptr;
ptr = #
printf("%u\n",ptr);
int address_holder;
address_holder = ptr;
int random_number = address_holder & 0x000000FF
// int random_number = address_holder % 100
printf("random number ; %u\n");
return 0;
}
我期望每次运行程序时都会生成一个随机数。 我注意到如果我使用 %u 来打印地址,它会导致内存地址被打印为数字 结果:失败,到目前为止我无法使用 %u 存储指针的打印值。
地址可能由操作系统随机化,以使利用某些错误变得更加困难。然而,有很多理由避免使用地址随机性来播种任何 RNG,甚至是非关键的 RNG:
出于所有这些原因,您应该永远不使用地址随机性来播种 RNG。使用高质量的随机源,例如 Linux 上的 getrandom() 系统调用或 Windows 上的 CryptGenRandom,为您的应用程序生成足够的熵; 128 到 256 位通常足以生成高质量的 PRNG。