1

重複の可能性:
rand関数は、単一の関数c++内で呼び出されたときに同じ値を返します

rand()が同じ数を生成するのはなぜですか?

die.h

#ifndef DIE_H
#define DIE_H


class Die
{
private:
    int number;
public:
    Die(){number=0;}
    void roll();
    int getNumber()const{return number;}
    void printValue();
};

#endif

die.cpp

#include"die.h"
#include<iostream>
#include<time.h>
using namespace std;

void Die::roll()
{
    srand(static_cast<int>(time(0)));
    number=1+rand()%6;
}

void Die::printValue()
{
    cout<<number<<endl;
}

main.cpp

#include"die.h"
#include<iostream>
using namespace std;

int main()
{
    Die d;
    d.roll();
    d.printValue();
    d.roll();
    d.printValue();
    d.roll();
    d.printValue();
}
4

3 に答える 3

6

への呼び出しdie.roll()は非常に接近しているため、time(0)実際には毎回同じ値を返します。したがって、 への呼び出しごとにランド シードは同じです.roll()

の外側で(Die コンストラクターや のようにsrand(static_cast<int>(time(0)));) 1 回 (そして 1 回だけ)呼び出してみてください。.roll()main()

于 2012-11-21T19:20:41.457 に答える
2

ランダムジェネレーターを「真にランダムな」(または少なくとも一意の)シードで初期化し、1回だけ実行する必要があります。

これは通常srand(time(NULL))、最初に行われます。

によって生成される数値rand()はランダムではなく、*疑似*ランダムです。同じシードが与えられると、常に同じシーケンスが返されます。デフォルトでは、最初のシードはゼロだと思います(ただし、プログラムの実行間で常に同じであるため、シードしないと、毎回同じ明らかにランダムなシーケンスが常に得られます)。

于 2012-11-21T19:18:57.007 に答える
0

emartel が指摘したように、必要な唯一の実際の変更は、 のtime(NULL)代わりに呼び出すことですtime(0)

srand(time(NULL))または、コンストラクターを呼び出してから in を使用することもできrand()ますroll()

于 2012-11-21T19:23:04.793 に答える