Делаете большие образцы с RNG от Park & ​​Miller? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь генерировать псевдослучайные числа с помощью RNG Park & ​​Miller, выполненного на 0 ++ 2 (в данный момент не работает 3) в C ++ из "Числовые рецепты в C" .Тезисные генераторы работают правильно, потому что это делает сэмплы равномерно распределенными между 0 и 1. Моя цель - получить огромный сэмпл (не менее 10 ^ 10), поэтому я использовал функцию malloc () для выделения памяти.Моя проблема в том, что выборка всегда мала (я хотел бы, чтобы генерировались случайные числа "j", например: если я инициализирую j = 1000, у меня будет 514 случайных чисел вместо 1000 ,Для того, чтобы проверить вещи, я сделал разные циклы "для").Я абсолютный новичок в 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);}

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Ваша проблема - ваши спецификаторы формата.Спецификатор "% lo" указывает scanf прочитать строковое представление восьмеричного целого без знака и сохранить его в объекте long, указанном соответствующим аргументом.

Это означает, что при вводе "1000", его интерпретируют как восьмеричное, и 1000 8 совпадает с 512 10 .Затем вы добавляете 2 к этому числу, что объясняет, почему вы видите 514 итераций для ввода «1000».

Используйте «d» вместо «o» в спецификаторах формата, чтобы указать десятичное целое число:

scanf("%ld", &j);
0 голосов
/ 13 июня 2018
scanf("%lo",&j);

Это означает, что введенное вами число является восьмеричным целым числом, то есть числом, состоящим только из цифр от 0 до 7.

Замените o из шаблона на u.

scanf("%lu",&j);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...