本文實例為大家分享了java隨機數生成代碼,供大家參考,具體內容如下
包com.gonvan.common.utils;導入Java.util。 *; /** * * * * * @author yuerzm * * /公共最終類LotteryaliasMethod { /** *用於從分佈中採樣的隨機數生成器。 */私人最終隨機隨機; /***別名表。 */ private final int []別名; /***概率表。 */私人最終雙[]概率; /** *根據概率分佈構建了一種從離散分佈中採樣的新別秒示例,並 *手動退回結果。 * <p/> *作為輸入給出的概率列表,與結果相對應0、1, * ...,n -1,此構造函數創建了從此分佈中有效採樣所需的概率和別名表 *。 * * @param概率 *概率列表。 */ public lotteryaliasmethod(list <double>概率){this(概率,new Random()); } /** *根據概率分佈從離散分佈中構建一個新的別名術,從離散分佈中樣本和 *手動恢復結果。 * <p/> *作為輸入給出的概率列表,與結果相對應的概率列表, *, * ...,n -1,以及應用作 *基礎生成器的隨機數生成器,該構造函數創建了有效地從該分佈中進行採樣所需的概率和 *別名表。 * * @param概率 *概率列表。 * @param隨機 *隨機數生成器 * / public lotteryaliasmethod(list <double>概率,隨機隨機){ / *開始對輸入進行基本的結構檢查。 */ if(probabilities == null || random == null)拋出新的nullpointerexception();如果(promabilities.size()== 0)拋出新的illegalargumentException(“概率向量必須是非空的。”); /*為概率和別名表分配空間。 */概率= new double [probabilities.size()]; alias = new Int [Probibilities.size()]; /*存儲基礎發電機。 */ this.random = random; /*計算平均概率並緩存以供以後使用。 * /最終雙平均值= 1.0 / promabilities.size(); / * *製作概率列表的副本,因為我們將對其進行 *更改。 */概率= new ArrayList <double>(概率); /*創建兩個堆棧以在我們填充表時充當工作清單。 */ deque <integer> small = new Arraydeque <integer>(); Deque <integer> grine = new Arraydeque <integer>(); /*使用輸入概率填充堆棧。 * / for(int i = 0; i <probabilities.size(); ++ i){ / * *如果概率低於平均概率,則我們將 *添加到小列表中;否則,我們將其添加到大列表中。 */ if(probabilities.get(i)> =平均)大add(i);否則小add(i); } / * *作為註意:在算法的數學規範中,我們 *將始終在大列表之前用盡小列表。但是, *由於浮點不准確,這不一定是正確的。 *因此,這個內部循環(嘗試配對大小元素)將不得不檢查兩個列表都不為空。 * / while(!small.isempty()&&! */ int lys = small.removelast(); int more = ligal.removelast(); / * *這些概率尚未擴大到使 * 1/n的重量1.0。我們在這裡做到這一點。 */概率[lims] = promabilities.get(lims) * probibilities.size();別名[LINS] = MORE; / * *通過適當的 *降低較大的概率。 */ probabilities.set(更多,(probabilities.get(more) + probabilities.get(lys)) - 平均值); / * *如果新概率小於平均值,則將其添加到 *小列表中;否則將其添加到大列表中。 * / if(probabilities.get(more)> = 1.0 / probabilities.size())否則小add(更多); } / * *在這一點上,所有內容都在一個列表中,這意味著 *剩餘的概率應為1 /n。基於此,將它們 *適當地設置。由於數值問題,我們無法確定哪個 *堆棧將保存條目,因此我們兩者都清空。 */ while(!small.isempty())概率[small.removelast()] = 1.0;而(! } /***從基礎分佈中採樣一個值。 * * @return從基礎分佈中採樣的隨機值。 * / public int next(){ /*生成一個公平的模具卷以確定要檢查哪個列。 */ int column = random.nextint(probinality.length); /*生成一個有偏見的硬幣折騰,以確定選擇哪種選項。 */ boolean cointoss = random.nextDouble()<概率[列]; /*基於結果,返回列或別名。 */返回COINTOSS?列:別名[列]; }}}以上就是本文的全部內容,希望對大家的學習有所幫助。 ,希望對大家的學習有所幫助。