如何从/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:

  • http://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00997_source.html#l01502

  • ✓libc++也可以:
  • http://llvm.org/svn/llvm-project/libcxx/trunk/include/random

  • ✗Visual Studio的实现甚至没有使用不确定的RNG:

    ✓从VS2012开始,MSDN指出“默认情况下产生的值是不确定的,并且是加密安全的”,可能是通过Windows的“加密服务”提供的。
  • http://msdn.microsoft.com/en-us/library/bb982250.aspx
  • 07-24 09:44
    查看更多