C ++ 11 Mersenne Twister har doim bir xil qiymatlarni ishlab chiqaradi

Buni takrorlashdan oldin (shuni bilishimga qaraganda, ko'p marta so'ralgan) StackOverflow-da o'nlab savollar/javoblar bilan bir qatorda ko'pgina "o'qituvchilar" va shunga o'xshash narsalarni o'qib chiqdim.

Men bilgan barcha tavsiyalarga qaramasdan, kodim har safar men ishlayotgan bir xil "tasodifiy" raqamni ishlab chiqaradi. Men nima bo'lishidan qat'iy nazar boshqa narsa qilyapman. Nima uchun bu ishlamaydi?

#include 
#include 
using namespace std;

random_device rd;    //used to initialise (seed) engine
mt19937 mt(rd());   //random-number engine used (Mersenne-Twister in this case)
uniform_int_distribution dist(1, 4);//guaranteed unbiased

Keyin kodda/funktsiya doirasida:

for (it : vec_one) {
    int rand_int = dist(mt);//Generate Random Number
    switch (rand_int) 
    {
    case 1:
        cout << "One!" << endl;
    case 2:
        cout << "Two!" << endl;
    case 3:
        cout << "Three!" << endl;
    case 4:
        cout << "Four!" << endl;
    default:
        break;
    }
}

Answer from comments Missing breaks in the switch statement. It really was that simple. Generator working fine. I forgot to include them in my overtired state and feel quite stupid. However... The number of comments and answers that skip over this issue highlight how easy it is to do. I feel slightly less stupid now...

2
Men uchun juda yaxshi ishlaydi, jonli misol uchun bu yerda ga qarang. qilyapman. Minimal kompilyatsiya qilinadigan namunani yuborishingiz mumkinmi? BTW, case iboralaridagi break s sizda yo'q, shuning uchun siz kalitlar kalitidan o'tib, One! Ikki! Uchta! To'rt! ekrani sifatida.
qo'shib qo'ydi muallif vsoftco, manba
Men uchun juda yaxshi ishlaydi, jonli misol uchun bu yerda ga qarang. qilyapman. Minimal kompilyatsiya qilinadigan namunani yuborishingiz mumkinmi? BTW, case iboralaridagi break s sizda yo'q, shuning uchun siz kalitlar kalitidan o'tib, One! Ikki! Uchta! To'rt! ekrani sifatida.
qo'shib qo'ydi muallif vsoftco, manba
Ba'zi onlayn kompilyatorlar keshlari ishlaydi. Agar biror sharh yoki biror narsa qo'shsangiz, u o'zgaradi. (Vsoftco havolasi yana so'roqqa tutiladi)
qo'shib qo'ydi muallif chris, manba
Ba'zi onlayn kompilyatorlar keshlari ishlaydi. Agar biror sharh yoki biror narsa qo'shsangiz, u o'zgaradi. (Vsoftco havolasi yana so'roqqa tutiladi)
qo'shib qo'ydi muallif chris, manba
Ba'zi onlayn kompilyatorlar keshlari ishlaydi. Agar biror sharh yoki biror narsa qo'shsangiz, u o'zgaradi. (Vsoftco havolasi yana so'roqqa tutiladi)
qo'shib qo'ydi muallif chris, manba
MSVC bilan emas, balki MinGW yoki biror narsa bilan emasligiga ishonchingiz komilmi? Oxirgi marta bilsam, libstdc ++ Windows ilovalari no-deterministik random_device ni yaratmagan (bu hali standart ko'rinishdan juda yaxshi qonuniydir).
qo'shib qo'ydi muallif chris, manba
MSVC bilan emas, balki MinGW yoki biror narsa bilan emasligiga ishonchingiz komilmi? Oxirgi marta bilsam, libstdc ++ Windows ilovalari no-deterministik random_device ni yaratmagan (bu hali standart ko'rinishdan juda yaxshi qonuniydir).
qo'shib qo'ydi muallif chris, manba
Sizning tizimiga cout << rd.entropy() natijasi nima? Shuningdek qarang cplusplus.com/reference/random/random_device . haqiqiy bo'lmagan deterministic tasodifiy sonlar generatori yo'q tizim, sizga (va entropiya() nazariy 0 qaytadi) boshqacha sekans har doim ko'rishni kutmagan edi, va dolzarb urug'ini oladi> mt19937 konstruktor, o'rniga ( ) ham bor misol qarang.
qo'shib qo'ydi muallif Jason C, manba
@ Chris Oh, bor. Ha, endi uni o'zgartirayotganini ko'raman.
qo'shib qo'ydi muallif Jason C, manba
@ Chris Oh, bor. Ha, endi uni o'zgartirayotganini ko'raman.
qo'shib qo'ydi muallif Jason C, manba
@ Chris Oh, bor. Ha, endi uni o'zgartirayotganini ko'raman.
qo'shib qo'ydi muallif Jason C, manba
Sizning tizimiga cout << rd.entropy() natijasi nima? Shuningdek qarang cplusplus.com/reference/random/random_device . haqiqiy bo'lmagan deterministic tasodifiy sonlar generatori yo'q tizim, sizga (va entropiya() nazariy 0 qaytadi) boshqacha sekans har doim ko'rishni kutmagan edi, va dolzarb urug'ini oladi> mt19937 konstruktor, o'rniga ( ) ham bor misol qarang.
qo'shib qo'ydi muallif Jason C, manba
Visual Studio/VC ++ ning qaysi versiyasini ishlatasiz?
qo'shib qo'ydi muallif Jerry Coffin, manba
Visual Studio/VC ++ ning qaysi versiyasini ishlatasiz?
qo'shib qo'ydi muallif Jerry Coffin, manba
Visual Studio/VC ++ ning qaysi versiyasini ishlatasiz?
qo'shib qo'ydi muallif Jerry Coffin, manba
Voy Hudoyim. Birinchi izoh bor. Kommutatorlikdagi tanaffuslar. Men o'zimni yomon his qilyapman, kodimda ishlatgan har bir switch bayonoti ularga tegishli. Bu loyihada 14 soat ishlashga erishishimga to'g'ri keladi, ammo bu faqat bitta "tanaffus" bilan amalga oshiriladi. Biroq, tasodifiy_device qanday ishlashi haqida juda ko'p narsalarni bilib oldim. Rahmat. Yangi siyosat: Stapheftda har qanday odamni bezovta qilishdan oldin, qaytib borib, bu masalani qaytarib oling. Umid qilamanki, u hali ham uyqusiragan holatlarda bir xil xato qilganlar uchun yaxshi Q/A vazifasini bajaradi.
qo'shib qo'ydi muallif UPChoo, manba
Voy Hudoyim. Birinchi izoh bor. Kommutatorlikdagi tanaffuslar. Men o'zimni yomon his qilyapman, kodimda ishlatgan har bir switch bayonoti ularga tegishli. Bu loyihada 14 soat ishlashga erishishimga to'g'ri keladi, ammo bu faqat bitta "tanaffus" bilan amalga oshiriladi. Biroq, tasodifiy_device qanday ishlashi haqida juda ko'p narsalarni bilib oldim. Rahmat. Yangi siyosat: Stapheftda har qanday odamni bezovta qilishdan oldin, qaytib borib, bu masalani qaytarib oling. Umid qilamanki, u hali ham uyqusiragan holatlarda bir xil xato qilganlar uchun yaxshi Q/A vazifasini bajaradi.
qo'shib qo'ydi muallif UPChoo, manba
Voy Hudoyim. Birinchi izoh bor. Kommutatorlikdagi tanaffuslar. Men o'zimni yomon his qilyapman, kodimda ishlatgan har bir switch bayonoti ularga tegishli. Bu loyihada 14 soat ishlashga erishishimga to'g'ri keladi, ammo bu faqat bitta "tanaffus" bilan amalga oshiriladi. Biroq, tasodifiy_device qanday ishlashi haqida juda ko'p narsalarni bilib oldim. Rahmat. Yangi siyosat: Stapheftda har qanday odamni bezovta qilishdan oldin, qaytib borib, bu masalani qaytarib oling. Umid qilamanki, u hali ham uyqusiragan holatlarda bir xil xato qilganlar uchun yaxshi Q/A vazifasini bajaradi.
qo'shib qo'ydi muallif UPChoo, manba

6 javoblar

Texnik jihatdan bu amaldagi xatti-harakatlardir. Yagona oyna dan:

std :: random_device amalga oshirish uchun aniq bo'lmagan pseudo-tasodifiy raqamli dvigatel uchun qo'llanilishi mumkin, agar deterministik bo'lmagan manba (masalan, apparat qurilmasi) bajarilmasa. Bu holda std :: random_device ob'ekti bir xil raqamlar ketma-ketligini yaratishi mumkin.

Agar standartdan taklifni tanlasangiz, u [rand.device]/2:

Agar dastur cheklovlari noanstantsialik bo'lmagan tasodifiy sonlarni ishlab chiqarishga to'sqinlik qilsa, dasturda tasodifiy raqamli motorni ishlatishi mumkin.

random_device::entropy() is supposed to be used for checking this, but unfortunately it's not implemented properly in most libraries, as the linked doc states (and I can confirm it for GCC 6.3, Clang 3.9 and MSVC 2015).

5
qo'shib qo'ydi

Texnik jihatdan bu amaldagi xatti-harakatlardir. Yagona oyna dan:

std :: random_device amalga oshirish uchun aniq bo'lmagan pseudo-tasodifiy raqamli dvigatel uchun qo'llanilishi mumkin, agar deterministik bo'lmagan manba (masalan, apparat qurilmasi) bajarilmasa. Bu holda std :: random_device ob'ekti bir xil raqamlar ketma-ketligini yaratishi mumkin.

Agar standartdan taklifni tanlasangiz, u [rand.device]/2:

Agar dastur cheklovlari noanstantsialik bo'lmagan tasodifiy sonlarni ishlab chiqarishga to'sqinlik qilsa, dasturda tasodifiy raqamli motorni ishlatishi mumkin.

random_device::entropy() is supposed to be used for checking this, but unfortunately it's not implemented properly in most libraries, as the linked doc states (and I can confirm it for GCC 6.3, Clang 3.9 and MSVC 2015).

5
qo'shib qo'ydi

Texnik jihatdan bu amaldagi xatti-harakatlardir. Yagona oyna dan:

std :: random_device amalga oshirish uchun aniq bo'lmagan pseudo-tasodifiy raqamli dvigatel uchun qo'llanilishi mumkin, agar deterministik bo'lmagan manba (masalan, apparat qurilmasi) bajarilmasa. Bu holda std :: random_device ob'ekti bir xil raqamlar ketma-ketligini yaratishi mumkin.

Agar standartdan taklifni tanlasangiz, u [rand.device]/2:

Agar dastur cheklovlari noanstantsialik bo'lmagan tasodifiy sonlarni ishlab chiqarishga to'sqinlik qilsa, dasturda tasodifiy raqamli motorni ishlatishi mumkin.

random_device::entropy() is supposed to be used for checking this, but unfortunately it's not implemented properly in most libraries, as the linked doc states (and I can confirm it for GCC 6.3, Clang 3.9 and MSVC 2015).

5
qo'shib qo'ydi

Kalit so'zlarida uzilishlar yo'q ... Quyidagi kod o'yinni bajaradi.

for (it : vec_one) {
    int rand_int = dist(mt);//Generate Random Number
    switch (rand_int) 
    {
        case 1:
            std::cout << "One!" << std::endl;
            break;
        case 2:
            std::cout<< "Two!" << std::endl;
            break;
        case 3:
            std::cout<< "Three!" << std::endl;
            break;
        case 4:
            std::cout<< "Four!" << std::endl;
            break;
        default:
            break;
        }
    }
1
qo'shib qo'ydi
Muammoning qalbini ko'rish yo'lidir.
qo'shib qo'ydi muallif Michael Dorgan, manba

Kalit so'zlarida uzilishlar yo'q ... Quyidagi kod o'yinni bajaradi.

for (it : vec_one) {
    int rand_int = dist(mt);//Generate Random Number
    switch (rand_int) 
    {
        case 1:
            std::cout << "One!" << std::endl;
            break;
        case 2:
            std::cout<< "Two!" << std::endl;
            break;
        case 3:
            std::cout<< "Three!" << std::endl;
            break;
        case 4:
            std::cout<< "Four!" << std::endl;
            break;
        default:
            break;
        }
    }
1
qo'shib qo'ydi
Muammoning qalbini ko'rish yo'lidir.
qo'shib qo'ydi muallif Michael Dorgan, manba

Kalit so'zlarida uzilishlar yo'q ... Quyidagi kod o'yinni bajaradi.

for (it : vec_one) {
    int rand_int = dist(mt);//Generate Random Number
    switch (rand_int) 
    {
        case 1:
            std::cout << "One!" << std::endl;
            break;
        case 2:
            std::cout<< "Two!" << std::endl;
            break;
        case 3:
            std::cout<< "Three!" << std::endl;
            break;
        case 4:
            std::cout<< "Four!" << std::endl;
            break;
        default:
            break;
        }
    }
1
qo'shib qo'ydi
Muammoning qalbini ko'rish yo'lidir.
qo'shib qo'ydi muallif Michael Dorgan, manba