我的任务是实现一个简单的替换加密方案,我给它一个编码器。
下面的程序适用于Mac,即使我已被指示让程序在Visual Studio for Windows中编译和运行。
我的理由是我拥有一台Mac并且认为在我喜欢的任何机器上编写程序也是一样,然后在必要时进行调整。毕竟它只是一个控制台模式应用程序。
我没想到程序在Mac上的表现如何:
在Mac上种子很简单似乎不起作用。即使我只使用了两种不同的种子,它也不断产生新的排列。
Windows上的Visual Studio生成了生成每个种子值唯一的排列的预期结果。对于Mac上的random_shuffle函数,srand只是没有任何意义,与PC不同吗?
下面的代码,然后输出剪切和粘贴。两者都来自Mac X-Code 7.2编译。
所以,基本上,为什么srand(种子)不做预期的事情呢?
/code
#include <string>
#include <cstdlib>
#include "algorithm"
#include <iostream>
using namespace std;
const string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.,í ";
string cp(unsigned seed) {
srand(seed);
string permutation = ALPHABET;
// using built-in random generator:
random_shuffle(permutation.begin(), permutation.end());
return permutation;
}
int main(int argc, char** argv) {
unsigned seedy = 100;
string what = cp(seedy);
cout << what << endl;
seedy = 200;
what = cp(seedy);
cout << what << endl;
seedy = 100;
what = cp(seedy);
cout << what << endl;
seedy = 100;
what = cp(seedy);
cout << what << endl;
getchar();
return 0;
}
/code
控制台输出:
'XQACKHSLOJ,TRBZNGV.W FIUEYDMP
OILQPNSWBAHYGTD'EFKV,XMR。 CJZU
Ĵ,DKXTHP'RQOEZCYG。 SMFIULABVNW
WNJTCYA EHSDPQLKO.ZURGF,'VMIBX
答案 0 :(得分:1)
srand(seed)
可能会或可能不会影响random_shuffle
的结果;这取决于实施,所以你不应该依赖它。
random_shuffle
函数使用未指定的随机源。这可能是rand()
,也可能是完全不同的东西;可能Visual Studio使用的C ++标准库实现使用rand()
,而您在OS X上使用的实现使用不同的随机源。
如果你真的需要在内部使用rand()
,你可以传递一元函数作为第三个参数,告诉它如何为随机数生成随机数:
random_shuffle(permutation.begin(), permutation.end(), [](int x) { return rand() % x; });