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