Последовательности случайных чисел, выводимые программой, не совпадают с фактическим выводом rand() в Linux (правильно работает в Windows)

Надеюсь, теперь, когда мой закрытый вопрос был автоматически удален, мне разрешено задать этот вопрос снова?

Итак, вот что я пытаюсь сделать:

Программа проверяет последовательности чисел, выдаваемые функцией rand() % 10, на наличие определенных строк чисел. В данном случае это строки 444 и 555. Таким образом, в Windows первая найденная программой последовательность, содержащая эти строки (только первые 10 чисел), — это последовательность, выводимая семенем 61163. Последовательность — 3355444555.

Теперь, просто чтобы убедиться, я проверяю, что rand() % 10 на самом деле выводит с этим начальным числом с помощью простой программы (обе программы показаны ниже), которая равна 3355444555. Очень ожидаемо.

Пока все имеет смысл.

Однако в Linux вывод программы не совпадает с тем, что фактически выводит rand(). Так, например, первая последовательность, которую программа находит, содержащая строки 444 и 555 в первых 10 числах, — это последовательность, выводимая начальным числом 154950. Последовательность — 4555232444.

Тем не менее, все имеет смысл (rand() имеет разные реализации в Windows/Linux, поэтому имеет смысл, что первая найденная последовательность полностью отличается от Windows).

Однако и в этом проблема: при проверке того, что rand() % 10 на самом деле выводит с этим начальным числом, в отличие от Windows, последовательности не совпадают. Последовательность, которая выводит 154950, на самом деле равна 1778785265 (проверено с помощью той же простой программы).

И это моя проблема. Как упоминалось ранее, действительно странная часть заключается в том, что код работает в Windows, и я не уверен, как что-то специфичное для Linux может испортить это.

Код для программы:

#include <iostream>
#include <sstream>
#include <cstdlib>
using namespace std;

int main()
{   
    int result;
    string text;    
    int minSeed;
    int maxSeed;
    string temp;
    cout << "Seed Seeker. Checks a range of random seeds for specific strings.\n";
    cout << "Random Seed: lowest value: ";
    getline(cin, temp);
    minSeed = atoi(temp.c_str());
    cout << "Random Seed: highest value: ";
    getline(cin, temp);
    maxSeed = atoi(temp.c_str());
    cout << "Generate how many random numbers / seed? ";
    getline(cin, temp);
    int rndRange = atoi(temp.c_str());
    string lookForThisA="444";
    string lookForThisB="555";

    for (int j = minSeed; j <= maxSeed; ++j)
    {
        text = "";
        for (int i = 0; i < rndRange; ++i){
            result = rand() % 10;
            text += static_cast<ostringstream*>(&(ostringstream() << result))->str();
        }
        if (text.find(lookForThisA) != std::string::npos) {
            if (text.find(lookForThisB) != std::string::npos) {
                std::cout << "\n\n\nString found!!!!\n\n";
                cout << text << "\n\nSeed: " << j << " ";
            }
        }
    }
} 

Программа, используемая для проверки вывода rand():

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
    srand(154950);
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
    cout << rand() % 10;
} 

person user3741346    schedule 01.07.2014    source источник
comment
Насколько мне известно, стандарт не предписывает конкретную реализацию rand; только то, что он будет производить одну и ту же последовательность чисел для одного и того же семени. Так что это зависит от компилятора/операционной системы, какую конкретную последовательность вы получите. См. этот вопрос: stackoverflow.com/questions/1026327/. Короче говоря, вы не можете ожидать, что семена будут переносимыми между платформами или даже между компиляторами.   -  person Dave    schedule 01.07.2014
comment
Извините, я вообще не могу обнаружить ни одного вызова раздачи (srand(int)) случайного движка в вашем 1-м образце?!? Те программы, которые вы упомянули, не связаны?   -  person πάντα ῥεῖ    schedule 01.07.2014
comment
Также для дальнейшего использования; если один из ваших вопросов закрыт, вам рекомендуется отредактировать его, чтобы попытаться сделать его более ясным. Вопросы могут быть открыты повторно, если сообщество считает, что они были доведены до нуля. Хотя я не могу комментировать подробности, так как не видел ни вашего первоначального вопроса, ни близкой причины.   -  person Dave    schedule 01.07.2014


Ответы (1)


Убедитесь, что вы задаете RNG каждую итерацию цикла:

for (int j = minSeed; j <= maxSeed; ++j)
{
    srand(j);  // <----- without that the RNG is not re-seeded
    text = "";

Что касается Windows по сравнению с Linux, я предполагаю, что в Windows (я предполагаю, что сборка Debug) srand была вызвана для вас CRT, а 61163 в этом случае не является семенем, а просто несколько раз повторяется 10-значный цикл, прежде чем получить к вашей последовательности ;-)

person YePhIcK    schedule 01.07.2014