我想選擇一個隨機數字並以彩票系統的格式表示該數字。例如,一個彩票系統有7組2位數字,從01到40,總可能的組合爲1638400000(40到7次冪)。如果我選擇一個隨機的基數爲10的數字,比如453,867,221,那麼我如何用01-40的7組數字來表示這個數字?如何將隨機數轉換爲另一種基本格式?
我選擇的編程語言是Python,但任何語言/僞語言都會有所幫助。
我想選擇一個隨機數字並以彩票系統的格式表示該數字。例如,一個彩票系統有7組2位數字,從01到40,總可能的組合爲1638400000(40到7次冪)。如果我選擇一個隨機的基數爲10的數字,比如453,867,221,那麼我如何用01-40的7組數字來表示這個數字?如何將隨機數轉換爲另一種基本格式?
我選擇的編程語言是Python,但任何語言/僞語言都會有所幫助。
所以你有40個鹼基的數字,7個40位的「數字」。把它們轉換成一個整數相對簡單(我使用顯式循環,使事情更清晰):
digits = [12, 5, 39, 1, 40, 8, 17]
total = 0
for digit in digits:
total = total * 40 + (digit-1)
轉換回是正好相反:
total = ...
digits = []
while total > 0:
digits = [(total % 40 + 1)] + digits
total = total/40
敢問包裝的邏輯和根本改變混淆。你希望用這個做什麼?爲什麼不更密切地建模域?
python#2的禪宗:顯式比隱式更好。
import this
import random
lottery_digits = range(1, 41)
lottery_size = 7
random_lottery_number = [random.choice(lottery_digits) for _ in xrange(lottery_size)]
如果你想避免重複,那麼你要看看使用random.sample
代替。
標準庫的random.sample
選n個值從人口無需更換:
>>> import random
>>> ' '.join('{:02d}'.format(n) for n in random.sample(xrange(1,41),7))
'25 19 15 09 01 26 06'
但這裏正是你要的是什麼,包括重複號的可能性:
import random
def display(n):
for _ in range(7):
d,n = n % 40 + 1, n // 40
print '{:02d}'.format(d),
print
display(0) # test lower limit
display(40**7-1) # test upper limit
display(random.randint(0,40**7-1))
結果:
01 01 01 01 01 01 01
40 40 40 40 40 40 40
18 23 27 14 23 31 38
+1哦,非常好,比我的廢話好多了! – wim 2012-03-06 07:06:09
+1優雅和非車輪改造。 (也可以用'_'作爲無關照,我忘了你可以做。) – 2012-03-06 07:10:03
真正的彩票不允許重複。你也需要爲此編寫代碼。 – 2012-03-06 06:51:02
記住log2(40^7)約爲37.3,所以你需要38位來表示整數的最大值。您必須確保爲二進制表示使用long。 – 2012-03-06 06:53:16