Как бы я случайным образом перебирал цикл [duplicate]

Была ли эта проблема, когда я вернулся на Java 6 и попытался запустить классы, ранее скомпилированные с помощью Java 7. Что для меня работало, было Preferences> java> compiler -> установить уровень соответствия 1.6 и критически «настроить параметры проекта» ..

65
задан thecoshman 24 April 2015 в 12:32
поделиться

4 ответа

Для C ++ 98 вы можете использовать:

#include <algorithm>

std::random_shuffle(cards_.begin(), cards_.end());

Начиная с C ++ 11, вы должны предпочесть:

#include <algorithm>
#include <random>

auto rng = std::default_random_engine {};
std::shuffle(std::begin(cards_), std::end(cards_), rng);

Пример Live на Coliru

Не забудьте повторно использовать один и тот же экземпляр rng во время нескольких вызовов на std::shuffle, если вы каждый раз будете генерировать разные перестановки!

153
ответ дан user703016 21 August 2018 в 05:59
поделиться
  • 1
    Вы также можете подключить произвольный генератор случайных чисел в качестве третьего аргумента std::random_shuffle. – Alexandre C. 3 August 2011 в 13:49
  • 2
    +1 - Обратите внимание, что это может привести к одинаковому результату при каждом запуске программы. Вы можете добавить произвольный генератор случайных чисел (который может быть посеян из внешнего источника) в качестве дополнительного аргумента в std::random_shuffle, если это проблема. – Mankarse 3 August 2011 в 13:50
  • 3
    Кажется, что без srand (unsigned (time (NULL))), он всегда генерирует одинаковый результат каждый раз ... – Gob00st 3 August 2011 в 14:46
  • 4
    @ Gob00st: он будет генерировать одинаковый результат для каждого экземпляра программы, а не для каждого вызова random_shuffle. Это нормальное явление. – user703016 3 August 2011 в 15:38
  • 5
    @ TomášZato #include <algorithm> – user703016 7 December 2014 в 22:58

Если вы используете boost , вы можете использовать этот класс (debug_mode установлен на false, если вы хотите, чтобы рандомизация могла быть предсказуемой между выполнением, вы должны установить ее на true):

#include <iostream>
#include <ctime>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int.hpp>
#include <boost/random/uniform_int_distribution.hpp>
#include <boost/random/variate_generator.hpp>
#include <algorithm> // std::random_shuffle

using namespace std;
using namespace boost;

class Randomizer {
private:
    static const bool debug_mode = false;
    random::mt19937 rng_;

    // The private constructor so that the user can not directly instantiate
    Randomizer() {
        if(debug_mode==true){
            this->rng_ = random::mt19937();
        }else{
            this->rng_ = random::mt19937(current_time_nanoseconds());
        }
    };

    int current_time_nanoseconds(){
        struct timespec tm;
        clock_gettime(CLOCK_REALTIME, &tm);
        return tm.tv_nsec;
    }

    // C++ 03
    // ========
    // Dont forget to declare these two. You want to make sure they
    // are unacceptable otherwise you may accidentally get copies of
    // your singleton appearing.
    Randomizer(Randomizer const&);     // Don't Implement
    void operator=(Randomizer const&); // Don't implement

public:
    static Randomizer& get_instance(){
        // The only instance of the class is created at the first call get_instance ()
        // and will be destroyed only when the program exits
        static Randomizer instance;
        return instance;
    }

    template<typename RandomAccessIterator>
    void random_shuffle(RandomAccessIterator first, RandomAccessIterator last){
        boost::variate_generator<boost::mt19937&, boost::uniform_int<> > random_number_shuffler(rng_, boost::uniform_int<>());
        std::random_shuffle(first, last, random_number_shuffler);
    }

    int rand(unsigned int floor, unsigned int ceil){
        random::uniform_int_distribution<> rand_ = random::uniform_int_distribution<> (floor,ceil);
        return (rand_(rng_));
    }
};

Чем вы можете протестировать его с помощью этого кода:

#include "Randomizer.h"
#include <iostream>
using namespace std;

int main (int argc, char* argv[]) {
    vector<int> v;
    v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);
    v.push_back(6);v.push_back(7);v.push_back(8);v.push_back(9);v.push_back(10);

    Randomizer::get_instance().random_shuffle(v.begin(), v.end());
    for(unsigned int i=0; i<v.size(); i++){
        cout << v[i] << ", ";
    }
    return 0;
}
1
ответ дан madx 21 August 2018 в 05:59
поделиться

http://www.cplusplus.com/reference/algorithm/shuffle/

// shuffle algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::shuffle
#include <vector>       // std::vector
#include <random>       // std::default_random_engine
#include <chrono>       // std::chrono::system_clock

int main () 
{
    // obtain a time-based seed:
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::default_random_engine e(seed);

    while(true)
    {
      std::vector<int> foo{1,2,3,4,5};

      std::shuffle(foo.begin(), foo.end(), e);

      std::cout << "shuffled elements:";
      for (int& x: foo) std::cout << ' ' << x;
      std::cout << '\n';
    }

    return 0;
}
7
ответ дан Mehmet Fide 21 August 2018 в 05:59
поделиться

В дополнение к тому, что сказал @Cicada, вы, вероятно, должны сначала семени,

srand(unsigned(time(NULL)));
std::random_shuffle(cards_.begin(), cards_.end());

Комментарий Пер @ FredLarson:

источник случайности для этой версии random_shuffle () определяется реализацией, поэтому вообще не может использовать rand (). Тогда srand () не будет иметь никакого эффекта.

Итак, YMMV.

6
ответ дан user 21 August 2018 в 05:59
поделиться
  • 1
    На самом деле источником случайности для этой версии random_shuffle() является реализация, поэтому она может вообще не использовать rand(). Тогда srand() не повлияет. Раньше я сталкивался с этим. – Fred Larson 3 August 2011 в 14:16
  • 2
    Вероятно, вы должны удалить этот ответ, потому что он неправильный и, что еще хуже, в некоторых реализациях он корректен и действительно прав, но не все, что делает этот совет очень опасным. – Andreas Bonini 3 August 2011 в 17:58
  • 3
    Как пояснил @Fred выше, что random_shuffle использует для генерации случайного числа, определяется реализация. Это означает, что в вашей реализации он использует rand() (и, следовательно, работает srand ()), но по моему он может использовать что-то совершенно другое, что означает, что при моей реализации даже при srand каждый раз, когда я запускаю программу, я получаю те же результаты. – Andreas Bonini 3 August 2011 в 18:32
  • 4
    @Code: кроме того, что он не работает? : S – Andreas Bonini 3 August 2011 в 20:26
  • 5
    @Code: как мы обсуждали, он не работает во всех реализациях. Тот факт, что вы можете предоставить собственное поколение чисел, не упоминается в вашем ответе и не имеет отношения к этой дискуссии в любом случае. Я чувствую, что мы идем по кругу: S – Andreas Bonini 3 August 2011 в 20:37
Другие вопросы по тегам:

Похожие вопросы: