0

私は、乱数 (1 から 100 まで) を生成し、C++ を使用してコンソールに出力するという単純なアイデアに取り組んでいましたが、問題は、プログラムを実行するたびに、毎回まったく同じ数値が生成されることです。 number は繰り返されませんが、乱数の順序は毎回同じです!

これが私のコードです

// DigitDisplayer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h" 
#include <iostream>
#include <cstdlib>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int max = 100;
    int min = 1;
    int range = (max - min) + 1;
int randnum;
bool nums[100];
for(int j = 0; j < sizeof(nums); j++)
{
    nums[j] = false;
}
for(int i = 0; i < range; i++)
{
    int randnum = (rand() % range) + 1;
    if(nums[randnum] == false){
        nums[randnum] = true;
        cout<< randnum << "\n\n";
    }
    else {
        int randnum = (rand() % range) + 1;
    }
}
cout<< "DONE!!!\n\n";
system ("pause");
}

ありがとう

4

4 に答える 4

1

C++ の乱数ジェネレーターは、実際には、特定のシードから始まる疑似乱数シーケンス ジェネレーターです。

これは、次の 2 つの理由で行われます。

  • C++ ライブラリを実装しているすべてのマシンでランダムの真のソースを見つけるのは非常に困難です。

  • 反復可能なシーケンスを生成する乱数ジェネレーターが明らかに必要です (たとえば、単体テストが乱数に依存している場合、テストを反復可能にして、同じ「乱数」を受け取る必要があります)。

そのため、乱数生成に「シード」を提供する srand 関数があります。

呼び出さないsrand場合、または同じ値で呼び出す場合、「ランダムな」シーケンスは常に同じになります。

さまざまなシードで呼び出すと、結果のシーケンスは一意になります (実際には、おそらくパターンがあるか、予測可能です。これは実装によって異なります)。

于 2013-02-26T14:59:04.740 に答える
0

srandシード関数を使用する必要があります。そうしないrandと、常に同じ数値セットが返されます。 time()で定義された関数cstdlib

これをチェックして:

// DigitDisplayer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h" 
#include <iostream>
#include <cstdlib>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int max = 100;
    int min = 1;
    int range = (max - min) + 1;
    int randnum;
    bool nums[100];

     srand (time(NULL));
for(int j = 0; j < sizeof(nums); j++)
{
    nums[j] = false;
}
for(int i = 0; i < range; i++)
{
    int randnum = (rand() % range) + 1;
    if(nums[randnum] == false){
        nums[randnum] = true;
        cout<< randnum << "\n\n";
    }
    else {
        int randnum = (rand() % range) + 1;
    }
}
cout<< "DONE!!!\n\n";
system ("pause");
}
于 2013-02-26T14:45:04.450 に答える
0

乱数ジェネレーターをシードする必要があります。その方法を確認してくださいsrand()

srand()通常は、を使用する前にどこかで 1 回呼び出すだけですrand()srand()プログラムを実行するたびに異なる値で呼び出す必要があることに注意してください。

たとえば、time()シードを使用するのが最も簡単な方法です。

int main()
{
     srand(time(NULL));
     .....
     rand();
     .....
}
于 2013-02-26T14:51:24.277 に答える
0

コンピュータは乱数を生成できません。代わりに、アルゴリズムを使用して、乱数の動作に近似する一連の数値を生成します。これらのアルゴリズムは、擬似乱数ジェネレータ (PNRG) と呼ばれます。私が知っているすべてのケースで、これらの PNRG に数値を「シード」することができます。これにより、疑似乱数のシーケンスがどこから始まるかが決まります。毎回異なる結果を得たい場合は、異なる数を使用して PNRG をシードする必要があります。ほとんどの場合、システム タイマーは、効果的にランダムな一連の数値を生成するのに十分です。srand(time(NULL))他の人が説明したように、あなたのためにこれを行います。

ところで、C に組み込まれている乱数ジェネレーターはひどいものです。最もカジュアルな設定を除いて、すべての使用に適しているわけではありません。適切な乱数のソースが必要な場合は、Mersenne Twister などの使用を検討してください。時間からのシードも、非常にデリケートな状況 (オンライン ギャンブルなど) では問題が発生する可能性があります。

于 2013-02-26T14:58:59.140 に答える