lua的隨機(jī)函數(shù): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
math.randomseed() ?設(shè)置seed?
math.random() ?產(chǎn)生隨機(jī)數(shù)
沒有設(shè)置seed使用了random函數(shù)黎棠,每次隨機(jī)的值都是一樣的鸽斟,很疑惑,所以查看了lua的源代碼眷蜓。查看源代碼后单山,發(fā)現(xiàn)randomseed調(diào)用的是srand榨馁,random調(diào)用的是rand
實際上黎休,math.randomseed()就是設(shè)置了隨機(jī)函數(shù)用來產(chǎn)生數(shù)字的唯一必要的參數(shù)式镐,沒有設(shè)置的話涛癌,就是默認(rèn)的值犯戏,因此產(chǎn)生的值也是不會變的。
rand中產(chǎn)生新的隨機(jī)數(shù)拳话,都用到上一個隨機(jī)數(shù)結(jié)果先匪,這個算法實際上很簡答,看完就可以發(fā)現(xiàn)假颇,如果最開始的seed相同胚鸯,產(chǎn)生的一系列的rand值都是一樣的(在math.random中還會rand返回的值進(jìn)行了處理,但是也不會改變他的隨機(jī)性)
綜上:
1笨鸡、使用math.random一定要設(shè)置隨機(jī)數(shù)種子姜钳。
2、種子相近形耗,最開始的幾個隨機(jī)數(shù)結(jié)果有可能是相同的(這個是和math.random的調(diào)整有關(guān)系)
解決了困惑好開心·~~
/*
* 描述:函數(shù)rand() 用于生成介于 0和RAND_MAX之間的偽隨機(jī)整數(shù)序列
* ?? 其中RAND_MAX是在頭文件 中定義的符號常 量, RAND_MAX的取值至少為32767
* 輸入:無
* 輸出:返回取值在0~RAND_MAX之間的偽隨機(jī)數(shù)
*/
int rand(void)
{
next = next *1103515245 +12345;
return (unsigned int)(next/65536) % (RAND_MAX);
}
/*
* 描述: srand函數(shù)用參數(shù)seed作為生成偽隨機(jī)數(shù)序列的函數(shù)rand的種子
* 輸入:種子seed
* 輸出:無
*/
void srand(unsigned int seed)
{
next = seed;
}