0

私の目標は、ユーザー (srand) から乱数を取得し、それを乱数ジェネレーター (rand) に供給して、1 から 10 までの乱数の 1000 回の反復を選択できるプログラムを作成することです。各数字が何回表示されたか (つまり、7 は 83 回表示されるなど)。

ユーザーから最初の数字を取得した後、1 から 10 までの 1000 個の数字をランダムに出力できますが、この出力を取得して配列にフィードする方法がわかりません。印刷。誰でも助けてもらえますか?

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

int rand1(void);
void srand1(unsigned int seed);

int main()

{
    int rand_array[1000];
    int count;
    int start=1;
    int end=10;
    int number_var;
    int ones=0;
    int twos=0;
    int threes=0;
    int fours=0;
    int fives=0;
    int sixes=0;
    int sevens=0;
    int eights=0;
    int nines=0;
    int tens=0;
    int frequency[11];
    int i=0;


    unsigned seed;



    printf("Please enter your choice for seed.\n");
    printf("(between 1-10)");

    while (scanf("%u", &seed) == 1)

    {
        srand1(seed);



        for(i=0; i < 1000; i++)
        {
            rand_array[i]=rand1()%(end-start+1)+start;
            frequency[rand_array[i]]++;
        }

        for(i = 1; i < 11; i++)
        {
            printf("There are %d %d's\n", frequency[i], i);
        }


    }


    return 0;

}





int rand1(void)

{
    static unsigned long int next = 1;

    next = next * 1103515245 + 12345;
    return (unsigned int) (next/65536) % 32768;
}




void srand1(unsigned int seed)

{
    static unsigned long int next = 1;
    next = seed;
}
4

1 に答える 1

4

サイズが 10 (または 11) の整数型の配列を持つことができます。各スロットは、その数値が生成される回数を表します。たとえば、スロット 3 は 3 を生成した回数を表します。

//declare array to hold frequencies
int frequency[11];

//reset all slots to 0
for(int i = 1; i < 11; i++)
{
  frequency[i] = 0;
}

//for each random number, increment the associated slot in the frequency array
for(int i = 0; i < 1000; i++)
{
  frequency[rand_array[i]]++;
}

//print the results
for(int i = 1; i < 11; i++)
{
  printf("There are %d %d's\n", frequency[i], i);
}

注: 既存のコードのほとんどを実際に読んだわけではないので、他に問題があるかどうかはわかりません。

編集:これは一般的なアイデアの例です。

いくつかの乱数があるとします:

5, 2, 4, 9, 9, 2, 1, 10

配列frequencyは 0 から始まります。

[0,0,0,0,0,0,0,0,0,0]

そのため、乱数をループして、関連するスロットをインクリメントします。

たとえば、5 を読み取ると、周波数配列は次のようになります。

[0,0,0,0,1,0,0,0,0,0]

次に2:

[0,1,0,0,1,0,0,0,0,0]

次に4:

[0,1,0,1,1,0,0,0,0,0]

次に9:

[0,1,0,1,1,0,0,0,1,0]

また

[0,1,0,1,1,0,0,0,2,0] 

最後に:

[1,2,0,1,1,0,0,0,2,1]

これで、それぞれの数がいくつあるかがわかりました。9 がいくつあったか知りたいとします。9 番目のスロットを見るだけで、そのうちの 2 つがあったことがわかります。

これはもっと理にかなっていますか?これは、数値ごとに 10 個の個別の変数を用意してから、「数値が 1 の場合は 1 の変数をインクリメントし、2 の場合は 2 の変数をインクリメントする」と言うよりもはるかに優れています。さらに、たとえば、1 ~ 10 ではなく 1 ~ 100 の乱数を使用すると、コードの適応がはるかに簡単になります。

于 2012-08-12T23:00:04.400 に答える