Unity C 生成隨機數問題

2021-09-24 19:34:41 字數 2992 閱讀 1328

此篇文章主要解決在同一時間內,多次呼叫

system.random.next()

unityengine.random.range()

等使用c#語言的編譯環境,產生重複值的問題(除去偶然性)

為了方便,下面**全部可以直接複製貼上使用

線性同餘隨機數生成器公式

x(n+1) = (a * x(n) + c) % m

古老的lcg(linear congruential generator)代表了最好最樸素的偽隨機數產生器演算法。主要原因是容易理解,容易實現,而且速度快。

其中,各係數為:

模m, m > 0

係數a, 0 < a < m

增量c, 0 <= c < m

原始值(種子) 0 <= x(0) < m

其中引數c, m, a比較敏感,或者說直接影響了偽隨機數產生的質量。

一般而言,高lcg的m是2的指數次冪(一般232或者264),因為這樣取模操作截斷最右的32或64位就可以了。多數編譯器的庫中使用了該理論實現其偽隨機數發生器rand()。

第n+1個數 = ( 第n個數 * a + b) % m

上面的公式中a、b和m分別為常數,是生成隨機數的因子,如果之前從未通過同乙個random物件生成過隨機數(也就是呼叫過next方法),那麼第n個隨機數為將被指定為乙個預設的常數,這個常數在建立乙個random類時被預設值指定,random也提供乙個建構函式允許開發者使用自己的隨機數因子,這一切可通過微軟官方開源**看到:

public random() : this(environment.tickcount)   public random(int seed)
為了生成更加可靠的隨機數,微軟在system.security.cryptography命名空間下提供乙個名為rngcryptoserviceprovider的類,它採用系統當前的硬體資訊、程序資訊、執行緒資訊、系統啟動時間和當前精確時間作為填充因子,通過更好的演算法生成高質量的隨機數。下面直接貼**了:

/// /// 隨機數方法

///

/// 取隨機數的個數

/// 隨機數的最小值(包含)

/// 隨機數的最大值(包含)

/// 結果陣列

public int randomfunction(int count,int minnum, int maxnum)

return result;

}/// /// 拿到隨機種子

///

///

private int getrandomseed()

還有一種方法與這種類似,可以直接歸類到這裡

使用system.guid().gethashcode()來替換randomseed

這種其實沒什麼用,但還是列出來吧,隨機數因子預設為時鐘,所以等一下就好了,一般也不用這種方法

system.random random = new system.random();

debug.log(random.next(1, 100).tostring());

thread.sleep(100);

debug.log(random.next(1, 100).tostring());

thread.sleep(100);

debug.log(random.next(1, 100).tostring());

思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把隨機抽取到的位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機數的上限減一。這樣就保證了取的值一定不會是重複的,但也有個缺點

取隨機數的個數一定不能大於最大值最小值的區間

/// /// 隨機數方法

///

/// 取隨機數的個數

/// 隨機數的最小值(包含)

/// 隨機數的最大值(包含)

/// 結果陣列

public int randomfunction(int count,int minnum, int maxnum)

return result;

}

這個不用多解釋,利用hashtable對比表的值保證每個隨機數只有乙個

不建議大量資料使用

/// /// 隨機數方法

///

/// 取隨機數的個數(不建議取過大)

/// 最小值(包含)

/// 最大值(包含)

/// 結果陣列

public int randomfunction(int count,int minnum,int maxnum)

}hashtable = null;

return result;

}

用它來檢測生成的隨機數是否有重複,如果取出來的數字和已取得的數字有重複就重新隨機獲取。

不建議大量資料使用

/// /// 隨機數方法

///

/// 取隨機數的個數(不要過大)

/// 最小值(包含)

/// 最大值(包含)

/// 結果陣列

public int randomfunction(int count, int minnum, int maxnum)

return arrnum;

}public int getnum(int arrnum, int tmp, int minvalue, int maxvalue, system.random ra)

n++;

}return tmp;

}

為了 精確 推薦採用第一種方法,為了 快速無重複 推薦使用第三種方法

Unity C 短時間生成不同隨機數

隨機數不夠隨機的問題,特別是放在for迴圈裡的隨機數,很容易出現連續幾個值都一樣 這是在例項化random類時,如果隨機種子不填寫,預設是以時間線作為種子進行偽隨機運算,當計算執行速度過快時,導致所有的隨機種子都是乙個值。改用guid的雜湊碼作為種子值,就不會重複了。guid.newguid get...

隨機生成隨機數

現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...

隨機數生成問題

給定隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式 方法1 rand5 5 rand5 得到 6,30 區間內25個數等概率分布 可以只用6 26之間的21個數,對映到1 7這7個數 27 30怎麼辦?拋棄掉 int rand7 這樣生成的1 7概率均勻,只是其和不等於1 方法2 用ran...