c++语言生成一个随机数,C++ 快速随机数生成器
問(wèn)題:
在計(jì)算旅行商問(wèn)題中的歐幾里得距離時(shí),我試圖使用 3-opt 算法來(lái)交換某些節(jié)點(diǎn);因?yàn)榇蠖嗲闆r下我有大約超過(guò)500個(gè)節(jié)點(diǎn),我需要隨機(jī)地選擇至少1/3的節(jié)點(diǎn)進(jìn)行交換。
所以我需要一個(gè)快速產(chǎn)生隨機(jī)數(shù)的函數(shù)(標(biāo)準(zhǔn)函數(shù)rand()太慢了)。不需要多么巧妙,差不多就行了。
注:忘了說(shuō),我無(wú)法使用除了標(biāo)準(zhǔn)庫(kù)(比如 STL,iostream 等)以外的庫(kù),所以 boost 庫(kù)也不行。
AndyV 的最佳答案:
其他人的答案提到了 Marsaglia 的 Xorshift 算法(https://en.wikipedia.org/wiki/Xorshift),但是沒(méi)人貼代碼。
static unsigned long x=123456789, y=362436069, z=521288629;
unsigned long xorshf96(void) { //period 2^96-1
unsigned long t;
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}
這段代碼幾乎在任何地方都適用;然而當(dāng)我試圖產(chǎn)生隨機(jī)的二進(jìn)制矩陣時(shí),它卻失敗了。大概是 95×95 的矩陣,它生成了太多或太少的奇異矩陣(我忘了具體是多還是少了)。這個(gè)隨機(jī)數(shù)生成器相當(dāng)于一個(gè)線性反饋移位寄存器。不過(guò)如果你要做加密或者蒙特卡洛的相關(guān)工作,這個(gè)生成器就不能用了。
補(bǔ)充:Xorshift 算法介紹
Xorshift?隨機(jī)數(shù)生成器是?George Marsaglia?發(fā)明的一類偽隨機(jī)數(shù)生成器。它們通過(guò)和自己邏輯移位后的數(shù)進(jìn)行異或操作來(lái)生成序列中的下一個(gè)數(shù)。這在現(xiàn)代計(jì)算機(jī)體系結(jié)構(gòu)非常快。它們是線性反饋移位寄存器的一個(gè)子類,其簡(jiǎn)單的實(shí)現(xiàn)使它們速度更快且使用更少的空間。然而,必須仔細(xì)選擇合適參數(shù)以達(dá)到長(zhǎng)周期。
Xorshift生成器是非密碼安全的隨機(jī)數(shù)生成器中最快的一種,只需要非常短的代碼和狀態(tài)。雖然它們沒(méi)有進(jìn)一步改進(jìn)以通過(guò)統(tǒng)計(jì)檢驗(yàn),這個(gè)缺點(diǎn)非常著名且容易修改(Marsaglia 在原來(lái)的論文中指出),用復(fù)合一個(gè)非線性函數(shù)的方式,可以得到比如像 xorshift+ 或 xorshift* 生成器。一個(gè)簡(jiǎn)單的C語(yǔ)言實(shí)現(xiàn)的 xorshift+ 生成器通過(guò)了所有的 BigCrush 的測(cè)試(比?Mersenne Twister 算法和?WELL 算法的失敗次數(shù)減少了一個(gè)數(shù)量級(jí)),而且在 x86 上產(chǎn)生一個(gè)隨機(jī)數(shù)通常只需要不到十個(gè)時(shí)鐘周期,多虧了指令流水線。
因?yàn)橐话愕?xorshift 生成器(沒(méi)有非線性這一步)在一些統(tǒng)計(jì)測(cè)試中失敗了,所以經(jīng)常被指責(zé)是不可靠的。
示例實(shí)現(xiàn)
一個(gè) xorshift 生成器的?C/C++?版本實(shí)現(xiàn):
#include
/* These state variables must be initialized so that they are not all zero. */
uint32_t x, y, z, w;
uint32_t xorshift128(void) {
uint32_t t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
這個(gè)算法有一個(gè)最大的周期2128?? 1 ,且通過(guò)了?diehard?測(cè)試。不過(guò),它在?TestU01?框架的 BigCrush 測(cè)試套件中的 MatrixRank 和 LinearComp 測(cè)試中失敗了。
總結(jié)
以上是生活随笔為你收集整理的c++语言生成一个随机数,C++ 快速随机数生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树莓派高级开发之树莓派博通BCM2835
- 下一篇: Devc++还原ggcc.graphic