2012-03-06 117 views
2

我想選擇一個隨機數字並以彩票系統的格式表示該數字。例如,一個彩票系統有7組2位數字,從01到40,總可能的組合爲1638400000(40到7次冪)。如果我選擇一個隨機的基數爲10的數字,比如453,867,221,那麼我如何用01-40的7組數字來表示這個數字?如何將隨機數轉換爲另一種基本格式?

我選擇的編程語言是Python,但任何語言/僞語言都會有所幫助。

+1

真正的彩票不允許重複。你也需要爲此編寫代碼。 – 2012-03-06 06:51:02

+1

記住log2(40^7)約爲37.3,所以你需要38位來表示整數的最大值。您必須確保爲二進制表示使用long。 – 2012-03-06 06:53:16

回答

5

所以你有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 
+2

你想從每個數字減去1轉換爲整數,並從整數轉換時加1。基數40有'數字'0-39。 – 2012-03-06 06:48:22

+0

當然,我會......謝謝。 – zmbq 2012-03-06 06:50:23

+1

謝謝你,zmbq和Jim。這是訣竅。 – tahoar 2012-03-06 07:11:44

0

敢問包裝的邏輯和根本改變混淆。你希望用這個做什麼?爲什麼不更密切地建模域?

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代替。

7

標準庫的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

+1哦,非常好,比我的廢​​話好多了! – wim 2012-03-06 07:06:09

+0

+1優雅和非車輪改造。 (也可以用'_'作爲無關照,我忘了你可以做。) – 2012-03-06 07:10:03

相關問題