【发布时间】:2021-02-28 17:14:01
【问题描述】:
我正在尝试制作一个迷你彩票模拟器。我想生成 8 个随机数,最小为 1,最大为 20。我将这些生成的数字存储在 Lottery 对象中。我有一个 LotteryManager 类,我可以在其中决定要生成这些彩票的次数。但我总是得到相同的随机数。我为生成器播种,所以我不明白它有什么问题。任何帮助表示赞赏!
这是我的彩票课:
class Lottery
{
private:
vector<int> lotteryA;
int lotteryB;
public:
Lottery();
vector<int> getLotteryA() const;
int getLotteryB() const;
void generateLotteryA();
void generateLotteryB();
void printLottery() const;
};
这是管理它的类:
class LotteryManager
{
private:
unsigned int quanity = 0;
map<unsigned int, Lottery> lotteries;
public:
LotteryManager();
LotteryManager(unsigned int q);
unsigned int getQuanity() const;
void setQuanity(unsigned int value);
void generateLotteries();
void printLotteries() const;
};
这是我的主要代码:
LotteryManager* lm = new LotteryManager(100);
lm->generateLotteries();
lm->printLotteries();
LotteryManager类中的生成和打印函数:
void LotteryManager::generateLotteries()
{
for(unsigned int i = 0; i < getQuanity(); ++i)
{
Lottery l;
l.generateLotteryA();
l.generateLotteryB();
lotteries.insert(make_pair(i, l));
l.printLottery();
}
}
void LotteryManager::printLotteries() const
{
cout << "Lotteries:" << endl;
for(auto current : lotteries)
{
cout << current.first << ".: ";
current.second.printLottery();
}
}
Lottery 类中的生成函数: (生成A和B只是不同的字段,因为游戏旨在模仿名为Putto的游戏,您需要从A字段的20中猜测8个数字,在B字段的4中猜测1)
void Lottery::generateLotteryA()
{
random_device rn_d;
mt19937 rng(rn_d());
uniform_int_distribution<int> dist(1, 20);
for(unsigned int i = 0; i < 8; ++i)
{
lotteryA.push_back(dist(rng));
}
}
void Lottery::generateLotteryB()
{
srand(time(0));
lotteryB = (rand() % 20) + 1;
}
提前致谢!
【问题讨论】:
-
"...当我正确地为生成器播种时?" 您没有正确地为生成器播种,因为您一直在重新播种。尝试只播种一次,让它成为一个单例。
-
@yazan 原则上问题是一样的,但我不会提出关于
<random>的问题重复关于rand()的问题,这有点倒退 -
@idclev463035818 绝对是。另一方面,这一定是骗子吧?我看了看,发现了很多
rand目标,但没有这个:p -
这能回答你的问题吗? srand() — why call it only once?
标签: c++ random random-seed