-1

srandと を使用して乱数を生成しようとしていrandます。ここでは、特定の桁数を生成したいと考えています。ある時点でプログラムを実行しているときに、5 桁の数値を生成するように要求すると、目的の出力が得られません。

私のコードは

for(k=0;k<n;k++)
    {
            temp = temp*10;
    }
    srand(time(NULL));
    i = rand()%temp;
    printf("%d\n",i);
    k = 0;
    temp = n;
    while(i != 0)
    {
            arr1[n+k] = i%10;
            i = i/10;
            n--;
    }

出力

Number of digits you want : 5
2031
while loop 1
while loop 3
while loop 0
while loop 2
N is 1
arr1[1] = 10651312
arr1[2] = 2
arr1[3] = 0
arr1[4] = 3
arr1[5] = 1

必要な桁数を取得するための問題はどこにあるのか教えてください。

Edit 私はそのコードを約100回実行しましたが、そのうち4回は機能しませんでした。残りは問題ありません...

4

3 に答える 3

2

問題は、配列のサイズではなく、生成した乱数のサイズでループしていることです。あなたの例では5桁が必要ですが、コードは4桁の数字2031を生成しました。これは、一番下のループの繰り返しで

  • ... n = 2, i = 2: ストア a[2] = 2, i = 0
  • ... n = 1、i = 0: ループ条件が失敗し、a[1] が設定されない

[1]にランダムなガベージを残します。乱数に実際に 4 桁ではなく 5 桁が含まれている場合、ループは正しく完了します。

代わりに n をループしたい

for(int j = n; j > 0; --j)
{
    arr1[n+j] = i%10;
    i = i/10;
}

これは配列を 1 から始まるものとして使用していることに注意してください。一方、C では配列は 0 から始まります。つまり、要素 0 から始まります。つまり、arr1[5] を使用するには、6 つの配列要素または 6 を malloc するか宣言する必要があります*sizeof(int) バイト。また、 よりも適切な変数名を使用する必要があることに注意してくださいtemp。変数を再利用してもメリットはありません。コンパイラは自動的にレジスタを再利用し、それを整理します。

于 2013-07-03T08:58:50.643 に答える
1
n = rand() % (largest - smallest + 1) + smallest;

5 桁の数字が必要な場合、最小の 5 桁の数字は何ですか? 最大数についても同じことを行います。これは、配列などを埋める必要なく、任意の数値範囲に使用できます。

あとは、指定された桁数の最大値と最小値を生成する方法を理解する必要があります。

ハッピーコーディング!

于 2013-07-03T09:10:30.107 に答える