Python';C++;? 现在我用C++中的随机数把头发扯了一会儿。

Python';C++;? 现在我用C++中的随机数把头发扯了一会儿。,c++,random,uniform,C++,Random,Uniform,在Python中,我拥有令人敬畏的: random.uniform(0, 1) 每次我打电话都会产生一个新的随机数 C++必须有这样的东西。我在谷歌上搜索了很长时间,找到了erand48(),我计划将它实现到我的raytracer中(我正在将它从Python翻译成C++) 我尝试了一个简单的测试用例,但我希望创建一个random\u uniform()函数,该函数总是会吐出一个新的随机数(使用time()在AICT上是行不通的,因为它将运行得非常快) 我尝试使用以前的输出作为新的Xi,如下所示

在Python中,我拥有令人敬畏的:

random.uniform(0, 1)
每次我打电话都会产生一个新的随机数

C++必须有这样的东西。我在谷歌上搜索了很长时间,找到了
erand48()
,我计划将它实现到我的raytracer中(我正在将它从Python翻译成C++)

我尝试了一个简单的测试用例,但我希望创建一个
random\u uniform()
函数,该函数总是会吐出一个新的随机数(使用
time()
在AICT上是行不通的,因为它将运行得非常快)

我尝试使用以前的输出作为新的
Xi
,如下所示(
Xi
s初始值已定义):

但这似乎不会产生足够多的随机数(而且它只会吐出
0
.I',不知道为什么…)


有什么方法可以让我创建一个每次都会吐出一个新随机数的函数吗?

是的-它被称为
std::rand()
,是标准的,并且在
中发布


是的-它被称为
std::rand()
,作为标准配置提供,并在
中发布


由于不熟悉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;
}
...

如果同时调用
srand
rand
,每次很可能得到相同的“随机”数,因为除非
时间
在此期间发生变化,否则您将使用完全相同的种子为生成器种子,从而得到完全相同的第一个随机数。

不熟悉python,我假设随机。均匀(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;
}
...

如果同时调用
srand
rand
,则每次很可能会得到相同的“随机”数,因为除非
时间
在此期间发生变化,否则将使用完全相同的种子为生成器种子,因此,得到的第一个随机数完全相同。

< P>有一个原因,你不只是使用<代码> RAND()/Cuff>,这是C++标准库的一部分吗?您提到的函数是单一UNIX规范的一部分,但可能不可移植

之所以一次又一次地得到相同的值,是因为没有对随机数生成器进行种子设定,所以它的行为是确定的。如果您对UNIX特定函数没有问题并且需要48位精度,请使用
srand()
srand48()
在程序开始时只调用一次,并传递它
时间(NULL)
。不要担心使用
time()
,因为您只调用了一次这个函数,所以不必担心总是得到相同的时间值

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


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

尝试:

unsigned short xsubi[3]={0,1,27};
对于(int i=0;i<10;++i)
{
双值=erand48(xsubi);
printf(“%f\n”,值);
}

<代码> > p>是否有一个原因,你不只是使用<代码> RAND()/Cuff>,这是C++标准库的一部分?你所指的函数是单个UNIX规范的一部分,但可能不是可移植的…… 之所以一遍又一遍地得到相同的值,是因为您没有对随机数生成器进行种子设定,所以它的行为是确定的。请使用
srand()
srand48()
如果您对UNIX特定函数没有问题,并且需要48位精度。只在程序开始时调用它一次,并传递它
时间(NULL)
。不用担心使用
时间()
,因为您只调用此函数一次,所以不必担心总是得到相同的时间值

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


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

尝试:

unsigned short xsubi[3]={0,1,27};
对于(int i=0;i<10;++i)
{
双值=erand48(xsubi);
printf(“%f\n”,值);
}
可能希望看起来像int
...
void init_program ( )
{
    ...
    srand(time(NULL));
    ...
}
...
float random_uniform ( )
{
    return ((float) rand( )) / RAND_MAX;
}
...
unsigned short xsubi[3] = { 0, 1, 27 };
for (int i = 0; i < 10; ++i)
{
   double value = erand48(xsubi);
   printf("%f\n", value);
}