0

1 から 200 までの 5 つの乱数を生成する最も簡単な方法は何ですか?

 randnum[0] < randnum[1] < randnum[2] < randnum[3] < randnum[4] 

私のコードは次のようになりますが、常に randnum[4] でオーバーフローします。

 limit_upper = 10; // generate random number up to 10 for randnum[0] 
 limit_lower = 0;

 srand((time(0));


 for (x = 0; x < 5; x++) {
         randnum[x] = 1 + limit_lower + (unsigned int) rand() % limit_upper;
         limit_lower = limit_lower + randnum[x];
         limit_upper = (limit_upper * 2) + (unsigned int) rand() % limit_upper;
 }

生成される乱数は繰り返されるべきではありません。

何か助けはありますか?

ありがとうございました。

4

5 に答える 5

4

1 から 200 までの乱数を生成し、並べ替えて、5 になるまで重複を破棄します。

于 2012-07-25T04:03:42.810 に答える
1

azhreiが指摘したように、あなたは物事を複雑にしすぎています。重複を破棄しながら0から200までの5つの乱数を生成し、終了したら並べ替えます。これは、コードを5つの数値を大幅に超えて拡張することを計画している場合、またはいくつかのクレイジーなパフォーマンス要件がある場合を除いて、うまく機能します。簡単で読みやすいバグのないコードについては、後で感謝します。また、ランダム性に対する人為的な制限を取り除きます。

于 2012-07-25T04:07:56.687 に答える
1

受け入れられた答えが示唆するように、ここに解決策があります:

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

     void quicksort(int arr[], int left, int right) {
             int i = left, j = right;
             int tmp;
             int pivot = arr[(left + right) / 2];

             while (i <= j) {
                     while (arr[i] < pivot)
                             i++;
                     while (arr[j] > pivot)
                             j--;

                     if (i <= j) {
                             tmp = arr[i];
                             arr[i] = arr[j];
                             arr[j] = tmp;
                             i++;
                             j--;
                     }

             };

             if (left < j)

             quicksort(arr, left, j);

             if (i < right)

             quicksort(arr, i, right);

     }

     int main() {
             int i;
             int x;
             int random[5];

             srand(time(0));

             for (i = 0; i < 5; i++) {
                     random[i] = 0;
             }


             for (i = 0; i < 5; i++) {
                     random[i] = rand() % 201;
                     for (x = 1; x < i; x++) {
                             if (random[x] == random[i]) {
                                     i--;
                                     continue;
                             }
                     }
             }

             quicksort(random, 0, 4);

             for (i = 0; i < 5; i++) {
                     printf("random[%0d]: %0d \n", i, random[i]);
             }

             return 0;
     }

多分誰かがそれが役に立つと思うでしょう。

于 2012-07-27T01:57:35.810 に答える
0

これは、Jon Bentley がProgramming Perlsでいくつかの角度から取り上げた古典的な問題です。この本を強くお勧めします。

于 2012-07-25T04:18:24.837 に答える
0

最後の行を見ると、limit_upper は 3 回目の繰り返しで最大 267 になる可能性があります。

最大の増加は limit_upper*2 + limit_upper-1 (約 3*limit_upper) です。

乱数発生器をシードするたびに同じ問題が発生しますか?

于 2012-07-25T04:06:05.223 に答える