C ++ 11 มีตัวสร้าง Mersenne Twister เป็นค่าเริ่มต้นซึ่งเป็นส่วนหนึ่งของ<random>
อินเทอร์เฟซใหม่ ตัวอย่างเช่นในการสร้างจำนวนเต็มอย่างสม่ำเสมอระหว่าง [-10, 10] โดยใช้ MT:
std::mt19937 eng; // This is the Mersenne Twister
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;
ส่วนใหญ่นี้ยังมีอยู่ในคอมไพเลอร์ใด ๆ ที่เสนอ TR1 แม้ว่าชื่อจะแตกต่างกันเล็กน้อย และstd::tr1::mt19937
std::tr1::uniform_int<int>
ฉันมักจะเตือนผู้ใช้ให้ห่างจากการใช้ Mersenne Twister มันเป็นอัลกอริธึมที่โอเค แต่ความนิยมจำนวนมากเป็นเพียงการตลาด 624 มิติของการสุ่มเป็นมากกว่าที่คนส่วนใหญ่ต้องการและ MT มีข้อกำหนดของรัฐที่ค่อนข้างหนักและเมื่อมันทำการคำนวณตารางเต็มมันสามารถระเบิดแคช ฉันเป็นส่วนบุคคลกับxorshiftซึ่งให้ช่วงเวลาที่ยอดเยี่ยมและมีการแจกแจงที่สมเหตุสมผลสำหรับทุกสิ่งที่เกมต้องการโดยมีหน่วยความจำขนาดเล็กและความต้องการซีพียู
ฉันได้เขียนตัวสร้าง xorshift ที่เป็นไปตามมาตรฐาน C ++ 11 - xorshift.hpp , xorshift.cpp - และวางไว้ในโดเมนสาธารณะ คุณสามารถเสียบมันเข้ากับฟังก์ชั่นการสุ่มตัวอย่าง C ++ 11 ใด ๆ ข้างต้น:
xorshift eng;
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;