从/ dev/urandom获取一个浮点数

Cha*_*l72 4 c c++ linux floating-point

如何从中获取随机浮点值/dev/urandom

如果我只是使用演员,说:

int fd = ::open("/dev/urandom", O_RDONLY);
uint32_t n;
read(fd, &n, sizeof(n));
float f = n;
Run Code Online (Sandbox Code Playgroud)

......我不确定我是否有可移植性的保证,因为我不知道大数值n是否必然可以表示为f?MAXUINT保证可以表示为float

bam*_*s53 5

您从/ dev/urandom获得随机字节,但这些字节不一定形成a)均匀分布的浮点值,或b)甚至是您将其视为对象的任何对象的合法表示.例如,在具有浮点数或整数的陷印表示的平台上,您创建的值可能会捕获表示,并且您将无法实际使用您创建的随机值.

你应该简单地验证你的库的实现是否std::random_device()允许访问/ dev/urandom(默认情况下或通过采用如下的字符串参数:std::random_device("/dev/urandom").然后你有一个随机数引擎,可以用来,例如,std::uniform_real_distribution<float>()为了获得您想要的随机数分布.

✓libstdc++默认使用/ dev/urandom:

✓libc++也有:

✗VisualStudio的实现甚至没有使用非确定性RNG:

✓从VS2012开始,MSDN声明"默认生成的值是非确定性和加密安全的",可能是通过Windows的加密服务.