我遇到了随机发生器的问题。 我正在尝试打印随机值,每次都得到几乎相同的值。
这就是我所拥有的:
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;
}
答案 0 :(得分:2)
我认为你可以在这里使用std::shuffle
来解决你的问题。像这样:
#include <vector>
#include <algorithm>
void Deck::shuffle() {
StackNode<Card>* top = stack->top;
std::vector<StackNode<Card>*> cards;
for (int i = 0; i < stack->numNodes - 1; i++) {
cards.push_back(findCard(i))
}
std::shuffle(cards.begin(), cards.end());
for (auto card : cards) {
std::cout << card->data.getFaceVal() << std::endl;
}
}
顺便说一句,我建议您只在代码中拨打srand
一次。
答案 1 :(得分:1)
rand()是一个伪随机数生成器。它生成的数字似乎是随机的,但它们是由完全确定的函数生成的。用sand()给它的种子决定了函数的起点。如果给它相同的种子,它将生成相同的随机数序列。您可以尝试这个并通过使用文字(例如srand(200))进行播种并多次运行程序来查看自己,您将获得完全相同的结果。
如果您每次在程序运行时都需要使用不同的内容播种时需要不同的结果,那么时间通常用作种子。在您的情况下,您处于一个非常紧凑的循环中,因此连续多次调用使用相同的时间值。
如果你在循环之前调用srand()一次,这个问题就会消失。