c语言 - 用Park&Miller RNG制作大样品?



我正在尝试使用 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 ran0ntapez 1 pour utiliser ran1ntapez 2 pour utiliser ran2ntapez 3 pour utiliser ran3ntapez 4 pour les utiliser tous");
scanf("%f",&d);
if( d!=0 & d!=1 & d!= 2 & d!= 3 & d!=4){
printf("Erreur: valeur incorrecte//incorrect valuen");
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,"%fn", ranp0[i]);
fprintf(simulationr1,"%fn", ranp1[i]);
fprintf(simulationr2,"%fn", ranp2[i]);
fprintf(simulationr3,"%fn", 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,"%fn", 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,"%fn", 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,"%fn", 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,"%fn", ranp3[i]);}
fclose(simulationr3);
system("PAUSE");
free(ranp3);}
system("PAUSE");
exit(1);}
scanf("%lo",&j);

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

将模式中的 o 替换为您。

scanf("%lu",&j);

您的问题是您的格式说明符。 说明符 "%lo" 告诉scanf读取无符号八进制整数的字符串表示形式,并将其存储在相应参数指向的long对象中。

这意味着当您输入"1000"时,它被解释为八进制,而 10008与 51210相同。 然后,您将 2 添加到该数字,这就解释了为什么您看到输入"1000"的 514 次迭代。

在格式说明符中使用"d"而不是"o"来指示十进制整数:

scanf("%ld", &j);

相关内容

  • 没有找到相关文章

最新更新