2015-08-06 2 views
0

Я задал вопрос об этом вчера, но тема была приостановлена ​​из-за недопонимания. Поэтому я пытался запустить программу для перетаскивания элементов в вектор. Эта часть завершается следующим кодом:Запрос о случайном перетасовке

srand(static_cast<unsigned int>(time(0))); 
random_shuffle(scores.begin(), scores.end()); 

Я принимаю, что код работает без ошибок, и что другие машины увидеть случайные перетасовать, но когда я запускаю этот код значение явно не перетасовать. Это часть более крупной программы, и когда другие запускают программу, значения явно перетасовываются, но когда я пытаюсь запустить программу снова и снова, значения не перетасовываются. Мне интересно, возможно, наивно, если это потому, что я запускаю его на MacBook, или, возможно, у меня нет моих файлов и папок, организованных должным образом. У кого-нибудь есть идеи?

Edit: Вот полный код:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    vector<int>::const_iterator iter; 

    cout << "Creating a list of scores."; 
    vector<int> scores; 
    scores.push_back(1500); 
    scores.push_back(3500); 
    scores.push_back(7500); 

    cout << "\nHigh Scores:\n"; 
    for (iter = scores.begin(); iter != scores.end(); ++iter) 
    { 
     cout << *iter << endl; 
    } 

    cout << "\nRandomizing scores."; 
    srand(static_cast<unsigned int>(time(0))); 
    random_shuffle(scores.begin(), scores.end()); 
    cout << "\nHigh Scores:\n"; 

    for (iter = scores.begin(); iter != scores.end(); ++iter) 
    { 
     cout << *iter << endl; 
    } 

    cout << "\nSorting scores."; 
    sort(scores.begin(), scores.end()); 
    cout << "\nHigh Scores:\n"; 
    for (iter = scores.begin(); iter != scores.end(); ++iter) 
    { 
     cout << *iter << endl; 
    } 

    return 0; 
} 

Я полагаю, это будет работать должным образом для всех, хотя, и именно поэтому я так растерялся.

+0

Где вы импортируете 'время'? Например, если это происходит из 'datetime', вы будете получать одно и то же семя каждый раз. –

+0

Я честно не уверен, потому что я довольно новичок в программировании, но я знаю, что когда я печатаю значение времени, каждый раз я запускаю программу. Но я думаю. –

+0

Как этот вопрос отличается от закрытого, который вы задали вчера? – Jashaszun

ответ

0

Если ваша программа делает что-то неприятное (например, неопределенное поведение), которое может повлиять на то, как он обращается к чему-либо, включая данные, относящиеся к системному времени.

Существует потенциальная проблема с качеством реализации вашей стандартной библиотеки, поэтому при каждом вызове она возвращает постоянное значение, а не другое значение. Некоторые реализации получают доступ к системным часам один раз, поэтому несколько вызовов time() будут возвращать одинаковые данные для каждого вызова. time() не требуется, чтобы зернистость лучше (меньше) секунды, поэтому справедливые несколько реализаций выбирают подход к эффективности, а не к точности.

Вызов time() несколько раз подряд - в том числе запуск ваших программ несколько раз - может означать, что одно и то же время измеряется.

Без небольшого, но полного образца кода, который показывает вашу проблему, и описание среды, в которой вы ее запускаете, невозможно дать окончательный совет.

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

+0

Должно быть, как я использую программу, потому что другие запустили точный код и правильно ли выполняли ее с случайным перетасовкой вектора, поэтому я не думаю, что это проблема, связанная с кодированием. Я не совсем уверен, что вы подразумеваете под тем, как я использую свою программу. –

+0

Как вы используете программу, описываете, что вы имеете в виду, «повторяя ее снова и снова». Например, вы используете пакетный файл, который запускает его несколько раз за секунду? Сколько элементов находится в векторе? Они фиксируются программно или читаются из файла? [Я отмечаю, что вы отредактировали свой пост noiw, чтобы включить код, который помещает только 3 элемента в вектор, что означает, что существует всего шесть возможных комбинаций, а это означает, что не требуется много повторения]. – Peter

+0

Итак, я снова запустил код с большим количеством элементов, и теперь их явно перетасовывают, поэтому спасибо за это. Но когда я запускаю программу снова и снова, элементы перетасовываются в том же порядке, что и в первый раз, и то же самое происходит на странице справки random_shuffle/shuffle. TBH, я недостаточно сообразителен, чтобы знать, как запустить пакетный файл, поскольку я все еще новичок в этом. –

Смежные вопросы