此篇文章主要解決在同一時間內,多次呼叫
system.random.next()
unityengine.random.range()
等使用c#語言的編譯環境,產生重複值的問題(除去偶然性)
為了方便,下面**全部可以直接複製貼上使用
線性同餘隨機數生成器公式
x(n+1) = (a * x(n) + c) % m
古老的lcg(linear congruential generator)代表了最好最樸素的偽隨機數產生器演算法。主要原因是容易理解,容易實現,而且速度快。第n+1個數 = ( 第n個數 * a + b) % m其中,各係數為:
模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()。
上面的公式中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...