【问题标题】:Inquiry about random shuffle查询随机洗牌
【发布时间】:2015-10-30 06:15:36
【问题描述】:

我昨天问了一个关于这个的问题,但由于沟通不畅,这个话题被搁置了。所以我试图运行一个程序来洗牌向量中的元素。这部分用以下代码完成:

srand(static_cast<unsigned int>(time(0)));
random_shuffle(scores.begin(), scores.end());

我接受代码运行没有错误,并且其他机器看到随机随机播放,但是当我运行此代码时,值显然不会随机播放。这是一个更大程序的一部分,当其他人运行该程序时,这些值显然被打乱了,但是当我尝试一遍又一遍地运行该程序时,这些值不会打乱。我可能天真地想知道这是因为我在 MacBook 上运行它,还是我的文件和文件夹没有正确组织。有人有什么想法吗?

编辑:这里是完整的代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    vector<int>::const_iterator iter;

    cout << "Creating a list of scores.";
    vector<int> scores;
    scores.push_back(1500);
    scores.push_back(3500);
    scores.push_back(7500);

    cout << "\nHigh Scores:\n";
    for (iter = scores.begin(); iter != scores.end(); ++iter)
    {
        cout << *iter << endl;
    }

    cout << "\nRandomizing scores.";
    srand(static_cast<unsigned int>(time(0)));
    random_shuffle(scores.begin(), scores.end());
    cout << "\nHigh Scores:\n";

    for (iter = scores.begin(); iter != scores.end(); ++iter)
    {
        cout << *iter << endl;
    }

    cout << "\nSorting scores.";
    sort(scores.begin(), scores.end());
    cout << "\nHigh Scores:\n";
    for (iter = scores.begin(); iter != scores.end(); ++iter)
    {
        cout << *iter << endl;
    }

    return 0;
}

我想这对每个人来说都可以正常运行,这就是我如此困惑的原因。

【问题讨论】:

  • 你从哪里导入time?例如,如果它来自datetime,那么您每次都会得到相同的种子。
  • 老实说,我不确定,因为我对编程很陌生,但我知道当我打印时间值时,每次运行程序都会有所不同。但我认为是 ctime。
  • 这个问题和你昨天问的封闭问题有什么不同?
  • 问题有所不同,因为昨天我假设代码有问题,但显然不是这样。现在我问是否有人知道这可能是我的硬件或我所做的一些组织性事情的结果。
  • 您应该只在程序开始时调用一次srand(),而不是每次调用std::random_shuffle()。否则,一个紧密的循环将继续播种相同的值,因为time(0) 每秒只更改一次。此外,您应该打印出 static_cast&lt;unsigned int&gt;(time(0)) 给您的内容,以查看那里发生的情况。

标签: c++ random hardware shuffle


【解决方案1】:

如果您的程序正在做一些不正常的事情(例如未定义的行为),这可能会影响它访问任何内容的方式,包括与系统时间相关的数据。

您的标准库的实现质量可能存在问题,因此每次调用它时都会返回一个常量值而不是不同的值。一些实现只访问一次系统时钟,所以多次调用time() 每次调用都会返回相同的数据。 time() 不需要具有更好(小于)一秒的粒度,因此少数实现选择一种效率而不是准确性的方法。

快速连续多次调用time() - 包括多次运行您的程序 - 可能意味着测量相同的时间。

如果没有一个小而完整的代码示例来展示您的问题,以及对您运行它的环境的描述,就不可能给出明确的建议。

您的问题更有可能在于您的代码或您如何使用您的程序,而不是您的标准库或硬件的特定问题。但是一个问题的所有相关概率都是非零的。

【讨论】:

  • 这一定是我使用程序的方式,因为其他人已经运行了确切的代码,并且在矢量随机洗牌的情况下正常运行,所以我认为这不是与编码相关的问题。不过,我不太确定我如何使用我的程序是什么意思。
  • 您如何使用该程序包括通过“一遍又一遍地运行它”来描述您的意思。例如,您是否使用在一秒钟内运行几次的批处理文件?向量中有多少个元素?它们是以编程方式固定的,还是从文件中读取的? [我注意到您已经编辑了您的帖子以包含仅在向量中放置 3 个元素的代码 - 这意味着总共只有六种可能的组合,这意味着不需要太多重复]。
  • 所以我用更多元素再次运行代码,它们现在显然正在被洗牌,所以谢谢你。但是,当我一次又一次地运行程序时,元素会按照与第一次完全相同的顺序进行混洗,并且在 random_shuffle/shuffle 参考页面上也会发生同样的事情。 TBH,我不够精明,不知道如何运行批处理文件,因为我还是新手。
  • 另外,我检查过,每次运行程序时,种子的值都会发生变化,尽管输出相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多