我已经用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
。我',不知道为什么......)。
有没有什么方法可以让每次都能发出一个新的随机数?
答案 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;
}
...
如果您同时同时拨打srand
和rand
,则每次都可能会获得相同的“随机”号码,因为除非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。