1. 程式人生 > >抽獎概率演算法

抽獎概率演算法

假設有一個數組[100,400,200,300],它的意思是,總數是100+400+200+300=1000. 取到第一個數的概率是100/1000,取到第二個數的概率是400/1000......程式碼如下:

function getResult(arr){
                var leng = 0;
                for(var i=0; i<arr.length; i++){
                    leng+=arr[i]                                     //獲取總數
                }
                for(var i=0; i<arr.length; i++){
                    
var random = parseInt(Math.random()*leng); //獲取 0-總數 之間的一個隨隨機整數 if(random<arr[i]){ return i //如果在當前的概率範圍內,得到的就是當前概率 } else { leng-=arr[i] //否則減去當前的概率範圍,進入下一輪迴圈
} } }

下面來解釋一下這個演算法,把陣列抽象出來,假設為a,b,c,d,這四個概率數,那麼,他們的總和就是 a+b+c+d. 畫成數軸:

從0-(a+b+c+d) 中取一個隨機數,數字落在對應的空間裡,取到的就是對應的概率.

第一次迴圈取數,有兩個可能: 

<a    或者    >a: 

如果是第一種可能,那就直接是概率a/(a+b+c+d),得到的對應結果就是a.直接返回.

如果是第二種可能,那麼概率應該是(b+c+d)/(a+b+c+d).然後進入第二次迴圈,第二次取數我們把a的概率空間減去,得到新的數軸:

新的數軸以原來的a為原點0,後面不變.這時候,總和變成 b+c+d.

從 0-(b+c+d) 中取一個隨機數,數字落在對應的空間裡,取到的就是對應的概率.

同樣有兩個可能: 

<b    或者     >b

如果是第一種,那麼它的概率就是 b/(b+c+d). 注意,這個概率出現的前提是第一次的結果是 >a ,所以總概率就是兩次乘積: (b+c+d)/(a+b+c+d)* b/(b+c+d) 得到的結果是 b/(a+b+c+d),得到的對應結果就是b.返回.

如果是第二種,那麼它的概率就是 (c+d)/(b+c+d). 同樣,和 >a 的結果同時出現,這種情況的總概率應該是: (b+c+d)/(a+b+c+d) * (c+d)/(b+c+d) 得到的結果是(c+d)/(a+b+c+d).然後進入第三次迴圈,然後第三次迴圈時,我們再把b的概率空間減去............以此類推.............

這樣直到最後...總能取到一個概率值...

這個演算法可以用在抽獎上,比如有這樣一組獎品和對應的概率:

複製程式碼
       var gifts = [
                {
                    "name":"mac",
                    "prop":1
                },
                {
                    "name":"紅米",
                    "prop":10
                },
                {
                    "name":"u盤",
                    "prop":40
                },
                {
                    "name":"香皂",
                    "prop":49
                }
            ];
複製程式碼

就可以用前面的函式來進行抽獎:

            var gArr = [];
            for(var i=0; i<gifts.length; i++){
                gArr.push(gifts[i]['prop'])
            }
            console.log(gifts[getResult(gArr)]['name'])    

轉流浪貓の窩https://www.cnblogs.com/liulangmao/p/4533293.html

相關推薦

經典抽獎概率演算法

php中獎概率演算法,可用於刮刮卡,大轉盤等抽獎演算法。用法很簡單,程式碼裡有詳細註釋說明,一看就懂 &lt;?php /* * 經典的概率演算法, * $proArr是一個預先設定的陣列, * 假設陣列為:array(100,200,300,400), * 開始是從1,1000 這個概

php 抽獎概率演算法

lottery.php &lt;?php //轉自https://segmentfault.com/a/1190000007431893 /* * 不同概率的抽獎原理就是把0到*(比重總數)的區間分塊 * 分塊的依據是物品佔整個的比重,再根據隨機數種子來產生0-* 中的某個數 * 判斷這

抽獎概率演算法

假設有一個數組[100,400,200,300],它的意思是,總數是100+400+200+300=1000. 取到第一個數的概率是100/1000,取到第二個數的概率是400/1000......程式碼如下:function getResult(arr){

幾種抽獎概率演算法

演算法一 複製程式碼程式碼如下: /**  * 全概率計算  *  * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4)  * @return string 返回上面陣列的key  */ function

關於抽獎概率演算法

        @Test         public void test(){            

抽獎概率-三種演算法

一、逢“幾”中獎 逢“幾”中獎,即通過預估抽獎人數和獎品數來判斷,“幾”=(抽獎人數/獎品數)*N。這是一種最簡單抽獎演算法,適合抽獎人數眾多,而且互相無聯絡的情況。如今大為流行的微博轉發得獎就常常使用這種演算法,即根據轉發次數來決定獎品歸屬,透明而且具有激勵性。 當然這個

中獎概率演算法(可用於刮刮樂、轉盤抽獎

說明 使用簡單的用法 ,高效的概率演算法實現抽獎邏輯 使用php語法,laravel框架總結 示例程式碼 <?php /** * 抽獎類 */ class AwardController { /** * 中獎邏輯實現

抽獎概率

data 一個人 ont 第一個 eid 抽獎 其中 con 事件 先抽獎與後抽獎的概率一樣麽,順序上有木有影響.說的是有295人參與抽獎,其中有19個是有獎的咯,那抽獎的先後順序與中獎的概率有影響嗎?希望能詳細的算出來看看, (1)第一個人的中獎概率是19/

javascript實現控制抽獎概率

parse lse ava () nbsp span cti man fun var manay; var a=0; //隨機數留倆位小數 function random(min,max){   return (Math.random()*(max-min) + min)

遊戲 簡單概率演算法

有時候我們要在場景中生成寶箱或者陷阱,控制相應的生成機率 思路: 利用Random.range(0,100)來生成一個隨機數字,然後判斷隨機數是否小於某概率數字,如果小於則生成,否則不生成 注意,Ra

n皇后概率演算法與確定演算法折衷考慮最後解法

#include "pch.h" #include <iostream> #include <vector> #include <random> #include <ctime> #include <time.h>

概率演算法

思想: 根據概率統計的思路來解決問題,結果得到的是近似值;適合於那些沒有或者很難計算解析的問題; 概率演算法基本步驟: 1、將問題轉換為相應的集合圖形S,S的面積容易計算,問題的結果往往對應集合圖形中某一部分S1的面積; 2、然後向集合圖形中隨機撒點; 3、統計集合圖形S和S1中的點數,

【原創】演算法分享(4)Cardinality Estimate 基數計數概率演算法

讀過《程式設計珠璣》(<Programming Pearls>)的人應該還對開篇的Case記憶猶新,大概的場景是: 作者的一位在電話公司工作的朋友想要統計一段時間內不同的電話號碼的個數,電話號碼的數量很大,當時的記憶體很小,所以不能把所有的電話號碼全部放到記憶體來去重統計,他的朋友很苦惱。 作

經典抽獎概率算法

頁面 and 說明 amp 會有 func 獎品 name 設備 php中獎概率算法,可用於刮刮卡,大轉盤等抽獎算法。用法很簡單,代碼裏有詳細註釋說明,一看就懂 &lt;?php /* * 經典的概率算法, * $proArr是一個預先設置的數組, * 假

php 抽獎概率 隨機數

<?php $prize_arr = array( '0' => array('id' => 1, 'title' => 'iphone5s', 'v' => 5), '1' => array('id' =>

基本演算法思想-概率演算法

package com.xj.www.algo; import java.util.Scanner; /** * 概率演算法 * * @author xiongjing * */ public class ProbabilityTest { // 蒙特卡羅演算法

java實現一個抽獎概率

在一些專案需求中,可能會遇到抽獎問題,如提供一系列獎品及獲獎概率,要求根據概率返回每次抽到的獎品。以下是本人在實際專案中寫的一個抽獎工具類,與大家共同分享: import java.util.ArrayList; import java.util.List; import

遊戲掉落概率演算法

遊戲開發中我們經常會用到物品掉落概率這個演算法,比如打怪掉不掉寶物,掉落的是何種寶物,這個都需要概率來控制的,在實際專案中抽獎系統有的也會採用跟掉落概率相似的演算法。並且,抽獎系統的概率可能還會隨著抽獎人數的變化而不斷調整,這個雖然看起來有點複雜,其實只是多了邏

抽獎小案例(js抽獎概率+css3旋轉動畫)

進入介面後2s開始旋轉抽獎,3s後停止,效果圖:實現程式碼:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="vi

概率演算法_二項分佈和泊松分佈

本次函式有 1、階乘 2、計算組合數C(n,x) 3、二項概率分佈 4、泊松分佈 以下是歷史函式 ---------------以上是舊的-------------------------------------------------------