C++ rand()在OS X Mavericks/XCode 5.1上坏了?(或者,“这是一个巨大的安全漏洞,还是我只是一个糟糕的程序员?”)

C++ rand()在OS X Mavericks/XCode 5.1上坏了?(或者,“这是一个巨大的安全漏洞,还是我只是一个糟糕的程序员?”),c++,xcode,macos,random,C++,Xcode,Macos,Random,下面的代码片段随机洗牌一个STL整数数组——它在Ubuntu和Red Hat上都能正常工作。然而,在我的MacOSX机器上,数组每次都以相同的顺序洗牌。代码的第二部分打印随机数生成器的输出,这显然不是随机的 当我升级OS X/XCode套件时,我是做错了什么,还是做了一些改变?不管怎样,这是一个安全漏洞吗。。。当然,许多可能用于生成随机数的遗留代码可能看起来是这样的,并且突然不再是随机的 想法 代码(您自己试试): 现在,在OS X上运行3次的输出: 6 0 3 5 7 8

下面的代码片段随机洗牌一个STL整数数组——它在Ubuntu和Red Hat上都能正常工作。然而,在我的MacOSX机器上,数组每次都以相同的顺序洗牌。代码的第二部分打印随机数生成器的输出,这显然不是随机的

当我升级OS X/XCode套件时,我是做错了什么,还是做了一些改变?不管怎样,这是一个安全漏洞吗。。。当然,许多可能用于生成随机数的遗留代码可能看起来是这样的,并且突然不再是随机的

想法

代码(您自己试试):

现在,在OS X上运行3次的输出:

6   0   3   5   7   8   4   1   2   9   
My seed is: 1395151529
==================
2085289957  535188259   1247555377  1780375578  1882685795  1276101667  521534680   1552603353  530759174   1969851427  


6   0   3   5   7   8   4   1   2   9   
My seed is: 1395151530
==================
2085306764  817663508   722721803   617835589   879311078   1746312939  622562224   862970584   1989537097  1829605489  


6   0   3   5   7   8   4   1   2   9   
My seed is: 1395151531
==================
2085323571  1100138757  197888229   1602779247  2023420008  69040564    723589768   173337815   1300831373  1689359551  

C++03


建议改用
std::shuffle
std::random_shuffle
的重载即将被弃用,而
rand
可以用
中的实用程序替换。您是在两者上都使用g++还是在OSX上使用clang?
std::random_shuffle
不需要使用
rand()
。因此,可能是Mac OSX上的标准库调用了不同的东西,因此设置
rand
seed没有效果。Chris的答案很好。代码可以在这里找到:虽然您必须首先使用-std=c++11进行编译,但我在代码中植入了std:srand,所以PRNG本身存在问题。此外,您的C++03解决方案似乎通常被推荐为不支持。请参阅Paul R链接的文章。Chris推荐的C++-11非常有效。您的问题没有C++11标记,因此有两个示例。第一种可能更好,它不是基于std::rand的,但需要C++11(std::shuffle和随机头)。第二个适用于C++03,但需要rand/srandYup,对此表示抱歉。
4   3   6   2   7   1   9   5   0   8   
My seed is: 1395151370
==================
38394197    1995358147  65276563    2013488432  1137737660  1255414699  924908498   309981427   1799367638  1337198287  

 2  4   7   9   6   8   5   3   0   1   
My seed is: 1395151371
==================
1281137856  2008486108  1477643146  1786210280  166055115   1227183121  819984618   1762177356  207844974   1730642206  

3   6   0   5   7   8   1   4   2   9   
My seed is: 1395151372
==================
397185149   960257000   1833707166  510257843   283547169   1218814437  1818880205  1086171377  1860201155  12516048
6   0   3   5   7   8   4   1   2   9   
My seed is: 1395151529
==================
2085289957  535188259   1247555377  1780375578  1882685795  1276101667  521534680   1552603353  530759174   1969851427  


6   0   3   5   7   8   4   1   2   9   
My seed is: 1395151530
==================
2085306764  817663508   722721803   617835589   879311078   1746312939  622562224   862970584   1989537097  1829605489  


6   0   3   5   7   8   4   1   2   9   
My seed is: 1395151531
==================
2085323571  1100138757  197888229   1602779247  2023420008  69040564    723589768   173337815   1300831373  1689359551  
template<class RandomIt> void random_shuffle(RandomIt first, RandomIt last);
// deprecated in C++14
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::random_device rd;
    std::mt19937 g(rd());

    std::shuffle(v.begin(), v.end(), g);

    copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
}
...
int my_random(int i) { return std::rand() % i;}

std::srand(seed);
std::random_shuffle(myOrder.begin(), myOrder.end(), my_random);
...