0

ランダムに生成された一連の数値を保存して、後で別の関数で呼び出すことができるようにする最良の方法を見つけようとしています。基本的に、数字を生成して繰り返しがないことを確認する関数が 1 つありますが、数字のリストを検索して、ユーザーがそれらの数字の 1 つを選択したかどうかを確認する別の関数が必要です。検索関数内で乱数関数を呼び出すたびに、さまざまな乱数のリストが取得されます。

基本的に、この数値の配列を保存して、次に関数を呼び出したときに既知の数値が得られないようにする最善の方法、またはそれを次の関数に渡す最良の方法を見つけようとしています。

次の関数に何を渡そうとしているかを知りたい場合に備えて、乱数ジェネレーター関数を次に示します。

int i, j;
/*generates the set of random numbers*/
for(i = 0; i < MAX; i++) {



    random = rand() % 101;
   /*checks to to make sure there is no repeats*/
  for (j = 0; j < i; j++) {
       if (lucky[j] == random) {
          random = rand() % 101;
                               }
                          }
       lucky[i] = random;

printf("%3d",random);
                          }                          
4

3 に答える 3

1

最初に新しい配列を作成します。

int *lucky = malloc(amount_of_numbers_you_want * sizeof(int));

次に、通常どおり乱数を入力してから返します。例えば:

int* generate_random_numbers(int amount)
{
    int *lucky = malloc(amount * sizeof(int));

    /* Fill lucky[] with 'amount' unique random numbers. */

    return lucky;
}

次に、その関数を呼び出すたびに、それが返すポインターをどこかに保存します。free()不要になったときにそのポインタを忘れないでください。そうしないと、占有するメモリがリークします。

これは宿題のように見えるので、完全なコードを提供するのではなく、動的に割り当てられた配列を使用してこの種の問題に対処する一般的な方法論を提供します。

于 2012-10-20T17:32:14.830 に答える
0

したがって、まず第一に、乱数が常に異なることを保証するものではありません。

リストに [0.1,0.24,0.555] があり、0.24 の新しい RNG を追加すると、繰り返されますが、lucky[] にも格納される 0.1 を生成できます (したがって、好きではないので繰り返されます)。可能性は高くありませんが、可能です。

必要な方法は、while() を使用することです。新しい RNG がすべてのリストに対してチェックされた場合にのみ、追加されます。

最後に、一般的に RNG のリストを保存する最良の方法は、RNG のシードを設定することです。シード「a」が与えられると、シード「a」によって生成される数値のリストは常に同じです。その場合、結果は常に同じになるため、関数は非反復 RNG をチェックすることさえできます。

于 2012-10-20T17:30:42.083 に答える
0

@ニコスは正解を出しました。

呼び出し元関数でも配列にメモリを割り当て、それを乱数生成関数に渡すことができます。あなたが何をしていても、ラッキーがローカルに定義された配列ではないことを確認してください。さらに、数字を生成するロジックが間違っているようです (繰り返しなし)。@Nikos が指摘したように、これは学校の課題のようです。明らかな間違いを指摘します。

a) 2 度目に生成された数値 (最初の乱数が既存のリストと一致する場合の乱数への 2 回目の呼び出し) が生成された値の古いセットで正しくチェックされている場合を気にしません。

b) 乱数生成関数は、0 から RAND_MAX までの間の乱数を返します。RAND_MAX % 101 は 0 ではありません。つまり、乱数が生成される確率は一様ではありません。

于 2012-10-20T17:45:32.693 に答える