中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解隨機算法

發布時間:2021-09-29 13:39:10 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

本篇內容介紹了“如何理解隨機算法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

首先看看數據分析帝

大多數人都做出自己的猜測,這也是在不知道內部隨機算法的時候的唯一選擇,但是大多數人沒有給出自己親自的調查結果。這里給出一份100樣本的調查抽樣樣本數據,并提出自己的猜測。

1. 錢包錢數滿足截尾正態隨機數分布。大致為在截尾正態分布中取隨機數,并用其求和數除以總價值,獲得修正因子,再用修正因子乘上所有的隨機數,得到紅包價值。

這種分布意味著:低于平均值的紅包多,但是離平均值不遠;高于平均值的紅包少,但是遠大于平均值的紅包偏多。

如何理解隨機算法

圖1. 錢包價值與其頻率分布直方圖及其正態擬合

但看分布直方圖并不能推出它符合正態分布,但是考慮到程序的簡潔性和隨機數的合理性,這是最合乎情理的一種猜測。
越是后面的錢包,價值普遍更高

如何理解隨機算法

圖2. 錢包序列數與其價值關系曲線

從圖2中的線性擬合紅線可以看到,錢包價值的總體變化趨勢是在慢慢增大,其變化范圍大約是一個綠色虛線上下界劃出的“通道”。(曲線可以被圍在這么一個正合乎常規的“通道”中,也從側面反映了規律1的合理性,說明了并不是均勻分布的隨機數)
從另一個平均數的圖中也可以看出這一規律。

如何理解隨機算法

圖3. 平均數隨序列數的變化曲線

在樣本中,1000價值的錢包被分成100份,均值為10。然而在圖3中我們可以看到在最后一個錢包之前,平均數一直低于10,這就說明了一開始的錢包價值偏低,一直被后期的錢包價值拉著往上走,后期的錢包價值更高。

3. 當然平均數的圖還可以透露出另一個規律,那就是最后的那一個人往往容易走運抽得比較多。因為最后那一個人是錢包剩下多少就拿多少的,而之前所有人的平均數 都低于10,所以至少保證了最后一個人會高于平均值。在本樣本中,98號錢包抽到35,而最后一份錢包抽到46。

綜上,根據樣本猜測:

如何理解隨機算法

1. 抽到的錢大多數時候跟別人一樣少,但一旦一多,就容易多很多。
2. 越是抽后面的錢包,錢越容易多。
3. 最后一個人往往容易撞大運。

點評:這種明顯很實際有差異,小編每次不管什么時候搶都是幾毛錢。

第二位同學寫了一個簡單python 代碼

據觀察,紅包分錢滿足以下幾點:

1.不會有人拿不到錢

2.不會提前分完

3.錢的波動范圍很大

紅包在一開始創建的時候,分配方案就訂好了。搶紅包的時候,不過是挨個pop up而已。

因此 python 代碼如下:

def weixin_divide_hongbao(money, n): 
divide_table = [random.randint(1, 10000)
for x in xrange(0, n)] 
sum_ = sum(divide_table) 
return [x*money/sum_ for x in divide_table]

不過上述算法還有兩個小問題:

1.浮點數精度問題

2.邊界值的處理

第三位同學按照網上流傳的python寫了一個java的版本

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"個人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"個人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本輪發紅包中第"+(math.indexOf(Collections.max(math))+1)+"個人手氣最佳"); 
j++; 
}

第四位同學的這種算法看起來非常科學。

他認為:

1、每個人都要能夠領取到紅包;

2、每個人領取到的紅包金額總和=總金額;

3、每個人領取到的紅包金額不等,但也不能差的太離譜,不然就沒趣味;

4、算法一定要簡單,不然對不起騰訊這個招牌;

正式編碼之前,先搭建一個遞進的模型來分析規律

設定總金額為10元,有N個人隨機領取:

N=1

則紅包金額=X元;

N=2

為保證第二個紅包可以正常發出,第一個紅包金額=0.01至9.99之間的某個隨機數

第二個紅包=10-第一個紅包金額;

N=3

紅包1=0.01至0.98之間的某個隨機數

紅包2=0.01至(10-紅包1-0.01)的某個隨機數

紅包3=10-紅包1-紅包2

……

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"個人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"個人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本輪發紅包中第"+(math.indexOf(Collections.max(math))+1)+"個人手氣最佳"); 
j++; 
}

輸入一看,波動太大,這數據太無趣了!

第1個紅包:7.48 元,余額:2.52 元

第2個紅包:1.9 元,余額:0.62 元

第3個紅包:0.49 元,余額:0.13 元

第4個紅包:0.04 元,余額:0.09 元

第5個紅包:0.03 元,余額:0.06 元

第6個紅包:0.03 元,余額:0.03 元

第7個紅包:0.01 元,余額:0.02 元

第8個紅包:0.02 元,余額:0 元

改良一下,將平均值作為隨機安全上限來控制波動差

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"個人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"個人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本輪發紅包中第"+(math.indexOf(Collections.max(math))+1)+"個人手氣最佳"); 
j++; 
}

輸出結果見下圖

第1個紅包:0.06 元,余額:9.94 元

第2個紅包:1.55 元,余額:8.39 元

第3個紅包:0.25 元,余額:8.14 元

第4個紅包:0.98 元,余額:7.16 元

第5個紅包:1.88 元,余額:5.28 元

第6個紅包:1.92 元,余額:3.36 元

第7個紅包:2.98 元,余額:0.38 元

第8個紅包:0.38 元,余額:0 元

“如何理解隨機算法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜章县| 阳春市| 平舆县| 昌平区| 五河县| 静宁县| 东乡族自治县| 驻马店市| 慈利县| 博客| 正安县| 南汇区| 凉山| 枝江市| 石柱| 怀来县| 类乌齐县| 铜鼓县| 蓝田县| 沾化县| 成都市| 乌鲁木齐县| 通辽市| 凤台县| 霍州市| 安新县| 长岭县| 荥阳市| 新干县| 伊春市| 多伦县| 内丘县| 博湖县| 阿荣旗| 新源县| 石阡县| 永康市| 南和县| 璧山县| 长岭县| 遵义市|