rand () выводит тот же номер для моего while l oop, но не для моего цикла for - PullRequest
0 голосов
/ 07 марта 2020

Я делаю этот код для ролика случайных игральных костей, и я хочу получить случайное число, пока я не получу три 6 на кости. По какой-то причине это дает одинаковое число для всех прогонов, но на моем для l oop это работает. Могу ли я получить помощь, чтобы заставить это работать?

досадный В то время как l oop в вопросе:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int Ran(int max) {
return (rand() % max)+ 1;
}

int main(){

    int max = 6;
    int nsuc = 0, ncount = 0;
    int matt = 40;
    srand((unsigned) time(0));

    for(int i = 1; i <= 20; i++){
        while(!(nsuc >= 3)){
            int nr = Ran(max);
            if(nr < matt){
                ncount++;
                if(nr == 6){
                    nsuc++;
                }
            }
        }
        printf("Number of rolls until 3 6's = %d\n", ncount);
    }
}

Вычистил для l oop, так что теперь его легче читать:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void Shuffle() {
srand((unsigned) time(NULL));
}

int Ran(int max) {
return (rand() % max)+ 1;
}

void binomial(int run, int max, int btrials, int *array, int scount){

    for(int j = 1; j<=run; j++){
        for (int i=1;i<=btrials;i++){
            int r = Ran(max);
            if(r == 6){
            scount++;
            }
        printf("Trial %i, roll = %d\n",i , r);
        }
        array[j-1] = scount;
        scount = 0;
        printf("\nEnd of Run %d\n\n",j);
    }

}

int main(){

    int Runs;
    printf("How many runs do you want to do? > ");
    scanf("%d", &Runs);
    printf("\n");

    int bdist[20];
    int distcount = 0;
    int max = 6;
    int btrials = 20;
    int suc[Runs+1];
    int scount = 0;



    Shuffle();
    binomial(Runs, max, btrials, suc, scount);

    printf("All counts of succesful 6 rolls.\n");

    /*
    for(int z = 1; z<=Runs; z++){
        printf("Run %d has %d 6's\n", z, suc[z-1]);
    }
    */

    for(int k = 0; k<=btrials; k++){
        for(int j = 1; j<=Runs; j++){
            if(suc[j-1] == k){
                distcount++;
            }     
        }
        bdist[k] = distcount;
        distcount = 0;
    }

    for(int t = 0; t<=btrials; t++){
        printf("Number of runs with %d 6s = %d\n", t, bdist[t]);
    }

    return 0;

}

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Не ответ, строго связанный с вопросом, но кое-что я заметил.

Если я помню, генерация случайных чисел с использованием идиомы (rand % max)+ 1 не рекомендуется.

Один .

Два

0 голосов
/ 07 марта 2020

Вы никогда не сбросите nsuc или ncount в первой версии, в то время как l oop. После первого раза они все еще имеют свои значения из предыдущего l oop, поэтому вы получите тот же результат.

...