c++ - random_shuffle 和 srand() 每次都给我相同的结果

标签 c++ algorithm permutation

我正在尝试对字母表的随机排列进行一些处理,但是尽管使用了 srand(myseed),但每个排列都会产生相同的结果
我已经包含了 <algorithm> header 。

string create_permutation(unsigned seed)
{
    srand(seed);
    string permutation = ALPHABET;
    random_shuffle(permutation.begin(), permutation.end());
    return permutation;
}

cout << create_permutation(2) << endl; // or 3, 4, 5 etc
// continuously returns 'XQACKHSLOJ,TRBZNGV.W FIUEYDMP

如有任何帮助,我们将不胜感激。

编辑:最小、完整且可验证的示例

编辑 2: 对 mcve 的调整

#include <iostream>
#include <algorithm>   

using namespace std;

const string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.,' ";
string create_permutation(unsigned seed)
{
    srand(seed);
    string permutation = ALPHABET;
    random_shuffle(permutation.begin(), permutation.end());
    return permutation;
}

int main(){    
    cout << create_permutation(2) << endl; // or 3, 4, 5 etc
    // continuously returns 'XQACKHSLOJ,TRBZNGV.W FIUEYDMP
    return 0;
}

最佳答案

问题

  • 洗牌不是随机的,因为 shuffle_random每次调用时都为随机数生成器使用相同的种子。

srand不播种 random_shuffle功能,它播种randrandom_shuffle 通常调用rand ,但不必

random_shuffle有两种形式:

  • 一个接受 2 个参数(开始/结束迭代器)

  • 一个需要 3 个(开始/结束迭代器和一个随机生成器)。

您已经证明您知道如何使用第一种形式,但第一种形式的问题在于它在不同平台和不同编译器上的实现方式不同。它可能不会使用 rand()根本就是srand的功能种子。

您应该使用 3 参数形式并提供随机数生成器作为函数的参数。

可以关注this detailed answer了解如何制作您自己的随机数生成器,或者您可以提供 rand()random_shuffle作为随机数生成器。

关于c++ - random_shuffle 和 srand() 每次都给我相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36725218/

相关文章:

python - word2vec算法可以使用tensorflow分布在多计算机上吗?

algorithm - 如何找到无向图的两个不相交的生成树

php - "Unfolding"一个字符串

c++ - 如何使用opencv从图像中找到标尺位置?

c++ - 通过属性搜索和提取XML节点

c++ - 是否可以在同一个 C/C++ 程序中使用两个或多个不同的 yylex() 函数?

algorithm - Ukkonen 的后缀树算法 : procedure 'test and split' unclear

字符串的 C++ 递归置换算法 -> 不跳过重复项

java - 有人能给我解释一下这个排列/紊乱程序吗

c++ - 允许转换为 void(不是指针),为什么?