Python的C ++中的random.uniform()?

时间:2011-05-06 02:29:09

标签: c++ random uniform

我已经用C ++中的这些随机数字将头发撕掉了一段时间。

在Python中,我有一个很棒的:

random.uniform(0, 1)

每次我打电话时都会生成一个新的随机数。

C ++ 有类似的东西。我用Google搜索了很长时间,发现erand48(),我打算将其实现到我的光线跟踪器中(我正在将它从Python翻译成C ++)。

我尝试了一个简单的测试用例,但我希望创建一个random_uniform()函数,该函数总是吐出一个新的随机数(使用time()不会起作用AFAICT,因为这将是快速运行

unsigned short Xi[3] = {0, 1, 27};
std::cout << erand48(Xi);

输出是(每次我调用程序时都会输出):

0.174529

我尝试将以前的输出用作新的Xi,就像这样(Xi的初始值已定义):

float random_uniform() {
  long generated = erand48(Xi);
  int temp = generated * 1000000;

  unsigned short Xi[3] = {temp - 16, temp - 7, temp - 18};

  return generated;
}

但这似乎不会产生足够随机的数字(并且它只吐出0。我',不知道为什么......)。

有没有什么方法可以让每次都能发出一个新的随机数?

4 个答案:

答案 0 :(得分:3)

不熟悉python,我会假设random.uniform(0,1)从0和1之间的均匀分布中吐出一个随机数?

如果是,请尝试以下操作:

srand(time(NULL));
float myRand = ((float) rand( )) / RAND_MAX;

请注意,您的里程可能会有所不同 - rand()不能保证是一个非常高质量的随机数源。您可能会获得可视化工件,具体取决于实现以及您如何使用它。我在我的光线跟踪器中使用了Mersenne Twister随机数生成器。

编辑:为了更清楚一点,那就是:

...
void init_program ( )
{
    ...
    srand(time(NULL));
    ...
}
...
float random_uniform ( )
{
    return ((float) rand( )) / RAND_MAX;
}
...

如果您同时同时拨打srandrand,则每次都可能会获得相同的“随机”号码,因为除非time已更改与此同时,你将使用完全相同的种子为生成器播种,因此获得完全相同的第一个随机数。

答案 1 :(得分:2)

您是不是只使用rand(),这是C ++标准库的一部分?您引用的函数是Single UNIX Specification的一部分,但可能不是可移植的......

你反复获得相同值的原因是因为你没有为随机数生成器播种,所以它的行为是确定性的。如果您对特定于UNIX的函数没有问题并且需要48位精度,请使用srand()srand48()在程序开头只调用一次,并将其传递给time(NULL)。不要担心使用time(),因为您只调用此函数一次,您不必担心总是获得相同的时间值。

您可能还想参考此页面,了解如何从rand()获取返回值并将其缩放到您想要的范围:

USING THE C OR C++ rand() FUNCTION


编辑:返回并再次阅读erand48的文档。你会注意到它在[0,1]范围内返回一个double。你把它放在一个长的,这可能是你总是看到零(该值被截断为整数)的原因。我也认为它可能会使用序列中的当前数字为您更新unsigned long数组的值 - 您提供存储,它使用它来“跟踪”序列。

尝试:

unsigned short xsubi[3] = { 0, 1, 27 };
for (int i = 0; i < 10; ++i)
{
   double value = erand48(xsubi);
   printf("%f\n", value);
}

答案 2 :(得分:1)

是的 - 它叫做std::rand(),标配为<cstdlib>

http://msdn.microsoft.com/en-us/library/398ax69y(v=VS.100).aspx

答案 3 :(得分:1)

可能希望了解Boost.Random