如何从/dev/urandom
获取随机浮点值?
如果我只是使用强制转换,请说:
int fd = ::open("/dev/urandom", O_RDONLY);
uint32_t n;
read(fd, &n, sizeof(n));
float f = n;
...我不确定是否可以保证便携性,因为我不知道
n
的大值是否一定可以表示为f
?是否保证MAXUINT可以表示为float
? 最佳答案
您可以从/dev/urandom中获得随机字节,但这些字节不一定会形成a)均匀分布的浮点值或b)甚至是将它们视为任何对象的合法表示形式。例如,在具有捕获浮点数或整型表示形式的平台上,那么您创建的值很有可能将被捕获表示形式,并且您将无法实际使用所创建的随机值。
您应该简单地验证您的库的std::random_device()
实现是否允许访问/dev/urandom(默认情况下或采用诸如std::random_device("/dev/urandom")
之类的字符串参数。那么您就有了一个随机数引擎,可以与std::uniform_real_distribution<float>()
一起使用)以获得所需的随机数分布。
✓libstdc++默认使用/dev/urandom:
✓libc++也可以:
✗Visual Studio的实现甚至没有使用不确定的RNG:
✓从VS2012开始,MSDN指出“默认情况下产生的值是不确定的,并且是加密安全的”,可能是通过Windows的“加密服务”提供的。