c - 使用 Park&Miller RNG 制作大样本?

标签 c pointers random malloc

我正在尝试使用 Park&Miller RNG ran0 1 2 3(3 目前不起作用)在 C++ 中生成伪随机数,来自“C 中的数值配方”。 这些生成器可以正常工作,因为它使样本均匀分布在 0 和 1 之间。 我的目标是拥有一个巨大的样本(至少 10^10),所以我使用 malloc() 函数来分配内存。 我的问题是样本总是太小(我希望生成“j”个随机数,例如:如果我初始化j=1000,我将得到 514 个随机数而不是 1000 ,为了测试我做了不同的“for”循环)。 我是 C++(和编程)的初学者,我担心指针问题,但我不明白如何解决它。如果有人有解决方案或只是建议,那会对我有很大帮助,因为这个问题严重限制了我的实习(请对我的近似英语宽容:'))。代码如下:

int main(){
FILE* simulationr0 = fopen("E:/Simulation_stage/SimulationRan0","w");
FILE* simulationr1 = fopen("E:/Simulation_stage/SimulationRan1","w");
FILE* simulationr2 = fopen("E:/Simulation_stage/SimulationRan2","w");
FILE* simulationr3 = fopen("E:/Simulation_stage/SimulationRan3","w");
float d;
long j;
long seed;
printf("tapez 0 pour utiliser ran0\ntapez 1 pour utiliser ran1\ntapez 2 pour utiliser ran2\ntapez 3 pour utiliser ran3\ntapez 4 pour les utiliser tous");
scanf("%f",&d);
if( d!=0 & d!=1 & d!= 2 & d!= 3 & d!=4){
    printf("Erreur: valeur incorrecte//incorrect value\n");
    exit(0);}
printf("Combien de nombres pseudo-aleatoires ?// How many random numbers ?\n");
scanf("%lo",&j);
printf("Quelle graine ? Which seed ?\n");
scanf("%lo", &seed);
long *pseed=&seed;
if(d==4){
    float * ranp0;
    float * ranp1;
    float * ranp2;
    float * ranp3;
    ranp0 = (float*) malloc (j*sizeof(float));
    ranp1 = (float*) malloc (j*sizeof(float));
    ranp2 = (float*) malloc (j*sizeof(float));
    ranp3 = (float*) malloc (j*sizeof(float));
    for (int i=0;i<j+2;i+=1){
        ranp0[i]=ran0(pseed);
        ranp1[i]=ran1(pseed);
        ranp2[i]=ran2(pseed);
        ranp3[i]=ran3(pseed);
        fprintf(simulationr0,"%f\n", ranp0[i]);
        fprintf(simulationr1,"%f\n", ranp1[i]);
        fprintf(simulationr2,"%f\n", ranp2[i]);
        fprintf(simulationr3,"%f\n", ranp3[i]);
    }
    fclose(simulationr0);
    fclose(simulationr1);
    fclose(simulationr2);
    fclose(simulationr3);
    system("PAUSE");
    free(ranp0);
    free(ranp1);
    free(ranp2);
    free(ranp3);}
if(d==0){
    float * ranp0;
    ranp0 = (float*) malloc (j*sizeof(float));
    for (int i=0;i<j+2;i++){
        ranp0[i]=ran0(pseed);
        fprintf(simulationr0,"%f\n", ranp0[i]);}
    fclose(simulationr0);
    system("PAUSE");
    free(ranp0);}
if(d==1){
    float * ranp1;
    ranp1 = (float*) malloc (j*sizeof(float));
    for (int i=0;i<j+2;i++){
        ranp1[i]=ran1(pseed);
        fprintf(simulationr1,"%f\n", ranp1[i]);}
    fclose(simulationr1);
    system("PAUSE");
    free(ranp1);}
if(d==2){
    float * ranp2;
    ranp2 = (float*) malloc(j*sizeof(long));
    for (int i=0;i!=j;i=i+1){
        ranp2[i]=ran2(pseed);
        fprintf(simulationr2,"%f\n", ranp2[i]);}
    fclose(simulationr2);
    system("PAUSE");
    free(ranp2);}
if(d==3){
    float * ranp3;
    ranp3 = (float*) malloc(j*sizeof(float));
    for (int i=0;i<j+2;i++){
        ranp3[i]=ran3(pseed);
        fprintf(simulationr3,"%f\n", ranp3[i]);}
    fclose(simulationr3);
    system("PAUSE");
    free(ranp3);}
system("PAUSE");
exit(1);}

最佳答案

scanf("%lo",&j);

这会将您输入的数字解释为八进制整数,即仅包含数字 0 到 7 的数字。

用 u 替换模式中的 o。

scanf("%lu",&j);

关于c - 使用 Park&Miller RNG 制作大样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50837245/

相关文章:

random - 在 Fortran 77 中生成给定范围内的随机数

java - 不是每次都选择随机项目

c - 程序显示内存泄漏,即使在使用 free() 之后

连接所有输入字符串 [C 编程]

c++ - 如何随机初始化常量数据成员?

c - 指针框和圆图

C++ : Two pointers (supposedly) to the same address. 改变其中一个的内容不会改变另一个的内容

c - C 中的升序链表

代码优化

pointers - 使用CvMat的Opencv中的指针算法?