有没有人有一个最喜欢的增强随机数生成器,你能解释一下如何在代码中实现它.我试图让mersenne twister工作,并想知道是否有人偏好其他人之一.
我无法并行化我的monte carlo方法来计算pi.这是并行化的for循环:
#pragma omp parallel for private(i,x,y) schedule(static) reduction(+:count)
for (i = 0; i < points; i++) {
x = rand()/(RAND_MAX+1.0)*2 - 1.0;
y = rand()/(RAND_MAX+1.0)*2 - 1.0;
// Check if point lies in circle
if(x*x + y*y < 1.0) { count++; }
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用它会低估pi,如果我使用它schedule(static),它比串行实现慢schedule(dynamic).我究竟做错了什么?我已经尝试了其他方法来修复它(像这样:使用OpenMP计算PI的值),但它仍然比串行实现慢得多.
提前致谢
我正在研究两个线程,试图在main()中生成种子(time(null))种子的随机数.程序连续出现分段故障,直到我发现在使用线程时我们必须为自己的例程中的所有线程生成随机数,然后就没有seg错误了.
我试图在谷歌上找到答案,为什么我们必须为所有线程独立播种,但没有找到足够令人信服的答案.有人可以解释一下吗?谢谢!!
请看整个问题
我知道srand()应该只调用一次,但我的第二个代码段表明这不能解决问题!
我写的程序给了我输出,我无法弄清楚为什么会这样.代码段的不同更改会产生不同的输出.
代码目的:
代码用于omp简单地为3个线程运行一段代码.每个线程必须使用该rand()函数打印3个随机值.因此,共有9项产出.线程0是主线程/主程序的运行流程.线程1和线程2是在线程代码开始时创建的新线程.
代码:
#include<omp.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
#pragma omp parallel num_threads(3)
{
srand(time(NULL));
int i=0;
for(i=0;i<3;i++)
{
printf("\nRandom number: %d by thread %d", rand(), omp_get_thread_num());
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Random number: 17105 by thread 0
Random number: 30076 by thread 0
Random number: 21481 by thread 0
Random number: 17105 by thread 1
Random number: 30076 by thread 1
Random …Run Code Online (Sandbox Code Playgroud) 生成伪统一随机数([0,1中的双精度数])的最佳方法是:
3年前也有类似的文章,但是很多答案并不符合所有标准。例如,drand48特定于POSIX。
我知道的(但不确定)满足所有某些条件的唯一方法是:
from libc.stdlib cimport rand, RAND_MAX
random = rand() / (RAND_MAX + 1.0)
Run Code Online (Sandbox Code Playgroud)
注意@ogrisel 大约在3年前问了同样的问题。
编辑
调用rand不是线程安全的。感谢您指出@DavidW。
如何在C中生成随机数,以便在同一时间运行多个进程?
我想用srand和rand,但我不知道如何(也许使用进程ID?).