2

私が作った小さなゲームに問題があります。

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int span = 100;
srand(time(0));
int TheNumber = static_cast<double> (rand()) /RAND_MAX * (span -1) +1;
cout << "You need to guess the number between 1 and " << span << endl;
int mynumber;
int numberofAttempts = 0;

do {
    cout << ++numberofAttempts <<" Attempt: ";
    cin >> mynumber;
    if (mynumber > TheNumber)
        cout <<"Lower!" << endl;
    else if (mynumber < TheNumber)
        cout <<"Higher!" << endl;
} while (mynumber != TheNumber);

cout << "SUCESS!!!" << endl;
return 0;
}

ゲームは 0 から 100 の間の乱数を生成することになっていて、それを推測することになっています。このコードを 15 ~ 20 回実行した後、同じ数字が 8 回も生成されました (私の場合は 2)。

絶対的な乱数はなく、数式または何かを使用して乱数を取得することを知っています.使用srand(time(0))すると、現在の時間に依存することがわかります. しかし、私が上で述べたことを起こさせたくないので、どうすればそれを「もっと」ランダムにすることができますか。

初めて実行したときの結果は 11 でした。もう一度実行した後 (正しい数字を推測した後)、時間が変わっても 11 のままでした。

4

3 に答える 3

3

【追記1】

より良い乱数生成を本当に検討したい場合は、これが最初の良いアルゴリズムです。

http://en.wikipedia.org/wiki/Mersenne_twister

ただし、「コンピューターが生成した」(つまり、数学的に生成された) 乱数は疑似乱数にすぎないことに注意してください。疑似ランダムとは、アルゴリズムからの出力が正規分布を持っているように見えても、入力シードがわかっている場合、それらは本当に決定論的であることを意味します。真の乱数は完全に非決定論的です。

[オリジナル] 次のいずれかの行を試してみてください。

rand() % (span + 1);  // This will give 0 - 100
rand() % span;        // this will give 0 - 99
rand() % span + 1;    // This will give 1 - 100

それ以外の:

(rand()) /RAND_MAX * (span -1) +1

また、その結果を double にキャストしてから int に配置しないでください。

こちらもご覧ください:

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

コメントへのお返事!!!使用する場合:

rand() / (span + 1);

0 から 100 の間の値を取得するには、rand からの出力値が 0 から (100 * 100) の間である必要があり、この性質が保証されている必要があります。これは、単純分割によるものです。rand() が 101 - 201 を生成する場合、基本的に 1 の値がポップアウトし、rand() が 202 - 302 の値を出力する場合、2 が除算からポップアウトします。

この場合、100 * 100 は 10000 に過ぎず、32 ビット空間にはこれよりも大きな整数が存在することは間違いありませんが、一般的に除算を行っても、フルナンバースペースを提供!!!

于 2012-06-28T14:15:33.193 に答える
2

には多くの問題がありrand()ます。それらの1つに遭遇しました。これは、最初のいくつかの値が「ランダム」ではないということです。を使用する必要がある場合rand()は、最初の4つまたはからの結果を破棄することをお勧めしrand()ます。

srand (time(0));
rand();
rand();
rand();
rand();

のもう1つの問題rand()は、上記のハックの後でも、下位ビットがランダムではないことで有名です。一部のシステムでは、最下位ビットが0、1,0、1,0、1、...を交互に使用します。剰余ではなく商を使用するなど、常に上位ビットを使用することをお勧めします。

その他の問題:非ランダム性(のほとんどの実装はrand()ランダム性の多くのテストに失敗します)と短いサイクル。これらすべての問題がある場合、最善のアドバイスは、以外のものを使用することですrand()

于 2012-06-28T14:38:10.240 に答える
1

まず、rand() / RAND_MAX0 から 1 の間の数値を与えず、0 を返します。これは、rand() の結果で RAND_MAX が 0 回に収まるためです。どちらも整数であるため、整数除算では浮動小数点数は返されません。

次に、RAND_MAX は INT と同じサイズである可能性があります。RAND_MAX に何かを掛けると、オーバーフローが発生します。

于 2012-06-28T14:11:38.920 に答える