【问题标题】:Random Generator Help C++ [duplicate]随机生成器帮助 C++ [重复]
【发布时间】: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)中最推荐的方式是使用 &lt;random&gt; 和其中的类/函数,就像随机引擎和分布之间的组合,请参阅例如hererand/srand 可能会在未来的 C++17 标准中被弃用。
  • @Galik 好的。很抱歉问,你的意思是我需要移动 srand() 并且只让我的随机函数使用“r = rand() % 50”吗?

标签: c++ numbers generator


【解决方案1】:

我认为您可以在此处使用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

【讨论】:

  • 您的意思是只调用 srand 一次吗?
  • 我真的很感激。我对 STL 不是很熟悉,并且通常会回避它,但我很感激花时间研究它。不幸的是,我的老师强迫我们编写自己的 shuffle,而不是使用 STL。我没有具体说明,但可能应该有。 @安东
  • @DaveB 是的,我不确定在哪里调用 srand() 一次。但我想我明白了。非常感谢大家。有没有办法支持多个答案?你们都帮助我更好地理解它
  • @aaaa 你还不能对答案投票,因为你没有足够的声誉。但是,您可以(并且应该)接受您认为可以解决您的问题的答案。
  • @vsoftco 好的。我去哪里接受答案?等待 nvm 找到它。我选择了他,因为他明确说明了在哪里放置线路,但我发现所有帖子都有帮助。我不是想排除:(谢谢大家的帮助
【解决方案2】:

rand() 是一个伪随机数生成器。它生成的数字看起来是随机的,但它们是由完全确定的函数生成的。你用 sand() 给它的种子决定了函数的起点。如果你给它相同的种子,它将生成相同的随机数序列。您可以尝试这个并通过使用诸如 srand(200) 之类的文字进行播种并多次运行该程序来亲自查看,您将获得完全相同的结果。

如果您希望每次都获得不同的结果,您必须使用每次程序运行时都会有所不同的东西作为种子,因此通常将时间用作种子。在您的情况下,您处于一个非常紧密的循环中,因此连续的许多调用使用相同的时间值。

如果你调用 srand() 一次,在你的循环之前这个问题就会消失。

【讨论】:

  • 我喜欢你的例子。我想我现在明白了。把它搬到外面真的帮助了我。我意识到其他人说过这一点,但我不确定在我的代码中将 srand() 移动到哪里。谢谢!
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 2015-01-25
  • 2015-02-16
  • 2018-06-25
  • 2012-12-17
  • 2012-08-10
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多