随机生成器帮助 C++
Random Generator Help C++
我在使用随机生成器时遇到问题。
我试图打印出随机值,但每次都得到几乎相同的值。
这是我的:
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;
}
我想你可以在这里使用 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
。
rand() 是一个伪随机数生成器。它生成的数字看起来是随机的,但它们是由一个完全确定的函数生成的。你用 sand() 给它的种子决定了函数的起点。如果你给它相同的种子,它会生成相同的随机数序列。您可以尝试这个并通过使用文字播种来亲自查看,例如 srand(200) 和 运行 程序多次,您将获得完全相同的结果。
如果你每次都想要不同的结果,你必须用每次程序运行时都会不同的东西来播种,所以时间通常被用作种子。在您的情况下,您处于一个非常紧密的循环中,因此连续的许多调用都使用相同的时间值。
如果你调用 srand() 一次,在你的循环之前这个问题就会消失。
我在使用随机生成器时遇到问题。 我试图打印出随机值,但每次都得到几乎相同的值。
这是我的:
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;
}
我想你可以在这里使用 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
。
rand() 是一个伪随机数生成器。它生成的数字看起来是随机的,但它们是由一个完全确定的函数生成的。你用 sand() 给它的种子决定了函数的起点。如果你给它相同的种子,它会生成相同的随机数序列。您可以尝试这个并通过使用文字播种来亲自查看,例如 srand(200) 和 运行 程序多次,您将获得完全相同的结果。
如果你每次都想要不同的结果,你必须用每次程序运行时都会不同的东西来播种,所以时间通常被用作种子。在您的情况下,您处于一个非常紧密的循环中,因此连续的许多调用都使用相同的时间值。
如果你调用 srand() 一次,在你的循环之前这个问题就会消失。