1

次のプロトタイプを使用して関数を作成します。int getRandomIntFrom0ToK(int K) この関数は、間隔 [0,1] に一様に分布する乱数を生成する乱数発生器を呼び出し、正の整数 K に対して、整数 {0,1,2, に一様に分布する乱数を返します。 ..K}. 関数をテストするプログラムを作成します。これは、関数によって生成されたランダムな整数が {0,1,2,...K} の各数値にほぼ等しい確率でヒットすることを示しています。

では、なぜ 2 つの間隔があるのでしょうか。

{0,K} は理解できますが、なぜ [0,1] が必要なのですか?

私はこれまで何をしているのか分かりません:

#include <stdio.h>

int getRandomIntFrom0toK(int K)
{
    int i=0;

    printf("enter k:");
    scanf("%d",&K);

    while (i<K)
    {
        int num=(rand()%(K-1)+1);
        printf("%d\n",num);
        i++;
    }
}

int main(void)
{
    int result=getRandomIntFrom0toK(1+rand()%(1));
    return 0;
}
4

1 に答える 1

0

間隔 [0,1] は通常、乱数ジェネレーターが「実数」(つまり、int ではなく float) を返す場合に返すものです。これはあなたが望むものではなく、乱数ジェネレーターとして与えられたものです。あなたの仕事は、結果をあなたが望むものに変換することです。これは、0 から K までの整数です。

たまたま、C の rand() 関数は float ではなく int を返すため、コードをテストしている場合は、おそらく RAND_MAX で除算して同じ効果を得たいと思うでしょう。

このジェネレーターの結果を任意の間隔に変換するのは簡単です。結果に K を掛けて範囲 [0,K] に変換し、オフセット L を追加して範囲 [L, K] にシフトします。 L+K]。たとえば、-2 から +2 の間の数値が必要な場合は、次のようにします。

float x = rand() / (float) RAND_MAX; /* x is between 0 and 1 */
x = x * 4; /* x is now between 0 and 4 */
x = x - 2; /* x is now between -2 and 2 */

あなたの場合、浮動小数点数ではなく、0 から K までの整数が必要です。したがって、変換が完了したら、最も近い整数に丸めることができます。ただし、範囲を正しく選択して、0 と K が中間の整数と同じように、範囲外の値を取得しないように注意する必要があります (例: -1 または K+)。 1)。

于 2012-10-28T19:50:15.157 に答える