C ++控制台模式程序在Mac上生成不同的结果到Windows

时间:2016-03-09 18:20:37

标签: c++ windows macos encryption

我的任务是实现一个简单的替换加密方案,我给它一个编码器。

下面的程序适用于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

1 个答案:

答案 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; });