2012-03-06 10 views
2

乱数を選んでその数を宝くじシステムの形式で表現したいと思います。例えば、宝くじシステムは、01から40までの2桁の数字の7つのグループを有し、可能な組合せの総数は163,840,000,000(40の7乗)である。ランダムな基数10の数字、たとえば453,867,221を選択すると、01-40の7桁の2桁の数字の中でどのように表現できますか?乱数を別の基本形式に変換するにはどうすればよいですか?

プログラミング言語はPythonですが、任意の言語/疑似言語が役立ちます。

+1

実際の宝くじではリピートが許可されていません。あなたもそれをコーディングする必要があります。 –

+1

log2(40^7)は約37.3なので、最大値を整数として表すには38ビットが必要です。バイナリ表現には長い文字列を使用する必要があります。 –

答えて

5

したがって、40進数の数字には40の "数字"が7つ含まれています。整数に変換すると、(私は物事をより明確にするために、明示的なループを使用しています)比較的簡単です:

バック変換
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があります。 –

+0

私はもちろん...ありがとう。 – zmbq

+1

ありがとう、zmbqとJim。これはトリックです。 – tahoar

0

とベース変更の難読化。これで達成しようとしていることは何ですか?ドメインをより密接にモデル化してみませんか?

Python#2のZen:明示的なものは暗黙的なものよりも優れています。

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 

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)) 

結果:

ここ

>>> import random 
>>> ' '.join('{:02d}'.format(n) for n in random.sample(xrange(1,41),7)) 
'25 19 15 09 01 26 06' 

しかし、あなたは繰り返し数の可能性を含め、を求めまさにそれです

01 01 01 01 01 01 01 
40 40 40 40 40 40 40 
18 23 27 14 23 31 38 
+1

+1オハイオ州、非常に素晴らしい、私のくそよりはるかに良い! – wim

+0

+1エレガンスと非ホイールリニューアルのため。 ( '_'をドントケアとして使うこともできますが、私はあなたができることを忘れていました)。 –