關於骰子的乙個小演算法

2021-06-19 10:16:52 字數 1114 閱讀 4590

今天,遇到乙個演算法的問題,讓我頭疼一陣,其實也不是一道非常難的題,但奈何我怎麼求都沒有求出來,最後只有請教高人,才得以解決。

需求:三個骰子,他們的和為乙個定值,知道骰子的人,應該很快得出這個值的取值範圍為:3~18,隨機求三個骰子的點數。

說明:骰子的點數為1~6,我只隨機求乙個組合,不想求所有點數的組合,這樣動態規劃,貪心等,常用方法無法行得通(這是我認為的,因為我沒想過怎麼用這些方法去求)。這樣就得換個思路,我先隨機兩個點數,最後乙個點數用和相減就可以求出來。

範圍確定:利用上面所說方法,會遇到乙個求隨機數範圍的問題,這也是把我搞暈的地方。那就我直接說正確的方法,首先,每個骰子必定會有1點,那麼為了保證骰子會有1點,我就從和裡面減去3點(3個骰子)。那麼現在骰子點數容許的範圍為0~5,而骰子的和變為0~15.先看第乙個骰子,先這樣想下,如果用隨機數在0~5之間取乙個數,會有什麼問題。那麼會出現假如骰子的和為3,減去3後,變為0,這時如果在0~5之間隨機,很難取到0;同理想一下和為18的時候。之後就得好好想下了,首先現在乙個數字最小不能小於0最大不能大於5,這樣最基本的範圍就確定下來了,這樣根據前面的例子我們可以看出還需要乙個範圍,這樣想一下,假設3個的和為14,那麼最小的乙個最小值為2 即14-6-6=2,這樣就可以很容易想到第乙個骰子最小值為max(0,和-10);為什麼是,10呢,因為之前有減過3。現在再想想假如3個的和為5,那麼最大的乙個最大值為3,這樣第乙個骰子最大值為 min(和,5)。這樣同理可以想出第二個的範圍,對於第三個的值只要用和相減就行。

另乙個思想:我將這個問題數學化:

已知x+y+z=a,a為常數並且3<=a<=18,1<=x<=6,1<=y<=6,1<=z<=6,假設:我們先算出x的取值範圍,之後從取值範圍內隨機去乙個數,之後再確定y的取值範圍,再取乙個數,之後得到z的值

問:x關於a的取值範圍是多少

這是乙個網友的解答,gef就是x+y+z=a這個方程的面,最大點為c點和為18,最小點為a'點和為3,而分界點為和為13點,這樣就很容易想到上面所說的範圍。

乙個關於博士的小故事

下面是我看到的乙個小故事,也許已經很舊了,但是很有教育意義,覺得不錯就發上來了。有乙個博士分到一家研究所,成為學歷最高的乙個人。有一天他到單位後面的小池塘去釣魚,正好正副所長在他的一左一右,也在釣魚。他只是微微點了點頭,這兩個本科生,有啥好聊的呢?不一會兒,正所長放下釣竿,伸伸懶腰,蹭蹭蹭從水面上如...

關於vim,ctags的乙個小技巧

關於vim,ctags的乙個小技巧 vim可以使用ctags製作的tags檔案來瀏覽程式原始檔。問題是,當原始檔存放在目錄樹 也就是所謂的source tree 的時候,該怎麼辦呢?在預設情況下,ctags只會處理當前目錄裡的原始檔,而且vim也只會參考當前目錄的tags檔案。這時候,如果當前目錄裡...

關於Applet的乙個小收穫

最近為了打發空餘的時間,開始用 寫小遊戲。今天碰到了乙個讓我很迷惑的問題 寫好的程式在 eclipse 這樣的ide 工具裡執行一切正常。但當在頁面上執行時,會在要出現時不動,顯示 不出來。我讀去的方法如下 後來,在網上搜尋資料才發現 在網頁上有些許限制,而其中最大的限制就是 不能訪問本地硬碟。於是...