【发布时间】:2015-06-27 23:01:09
【问题描述】:
我在使用随机发生器时遇到了问题。 我正在尝试打印出随机值,并且每次都得到几乎相同的值。
这就是我所拥有的:
void Deck::shuffle() {
StackNode<Card>* top = stack->top;
for (int i = 0; i < stack->numNodes - 1; i++) {
int x = random(i);
StackNode<Card>* temp = findCard(x);
//cout << "Random index was: " << random(i) << endl;
//cout << "Face value of random was: " << temp->data.getFaceVal() << endl;
cout << "Top: " << top->data.getFaceVal() << endl;
cout << "Temp: " << temp->data.getFaceVal() << endl;
swapX(top,temp);
}
}
这是我的随机生成器函数:
int random(int index) {
int r;
srand(time(NULL));
cout << "Index: " << index << endl;
r = rand() % 50;
cout << "Random value: " << r << endl;
return r;
}
【问题讨论】:
-
创建 rand() 实例太快:创建一次,使用多次...
-
@MitchWheat 我认为这些调用每次都会产生不同的值?我需要改变什么?我的随机函数中的部分?还是在我的随机播放功能循环中?
-
srand()为生成器播种,并且只应在程序开始时调用一次。随着时间的推移快速播种会导致它一遍又一遍地接收相同的种子,因为time()仅精确到最接近的秒。在时钟改变之前,计算机每秒可以做数百万件事情。 -
现代 C++(即 C++11/14)中最推荐的方式是使用
<random>和其中的类/函数,就像随机引擎和分布之间的组合,请参阅例如here。rand/srand可能会在未来的 C++17 标准中被弃用。 -
@Galik 好的。很抱歉问,你的意思是我需要移动 srand() 并且只让我的随机函数使用“r = rand() % 50”吗?