Была ли эта проблема, когда я вернулся на Java 6 и попытался запустить классы, ранее скомпилированные с помощью Java 7. Что для меня работало, было Preferences> java> compiler -> установить уровень соответствия 1.6 и критически «настроить параметры проекта» ..
Для 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);
Не забудьте повторно использовать один и тот же экземпляр rng
во время нескольких вызовов на std::shuffle
, если вы каждый раз будете генерировать разные перестановки!
Если вы используете 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;
}
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;
}
В дополнение к тому, что сказал @Cicada, вы, вероятно, должны сначала семени,
srand(unsigned(time(NULL)));
std::random_shuffle(cards_.begin(), cards_.end());
Комментарий Пер @ FredLarson:
источник случайности для этой версии random_shuffle () определяется реализацией, поэтому вообще не может использовать rand (). Тогда srand () не будет иметь никакого эффекта.
blockquote>Итак, YMMV.
random_shuffle()
является реализация, поэтому она может вообще не использовать rand()
. Тогда srand()
не повлияет. Раньше я сталкивался с этим.
– Fred Larson
3 August 2011 в 14:16
random_shuffle
использует для генерации случайного числа, определяется реализация. Это означает, что в вашей реализации он использует rand()
(и, следовательно, работает srand ()), но по моему он может использовать что-то совершенно другое, что означает, что при моей реализации даже при srand каждый раз, когда я запускаю программу, я получаю те же результаты.
– Andreas Bonini
3 August 2011 в 18:32
std::random_shuffle
. – Alexandre C. 3 August 2011 в 13:49std::random_shuffle
, если это проблема. – Mankarse 3 August 2011 в 13:50random_shuffle
. Это нормальное явление. – user703016 3 August 2011 в 15:38#include <algorithm>
– user703016 7 December 2014 в 22:58