乱数を選んでその数を宝くじシステムの形式で表現したいと思います。例えば、宝くじシステムは、01から40までの2桁の数字の7つのグループを有し、可能な組合せの総数は163,840,000,000(40の7乗)である。ランダムな基数10の数字、たとえば453,867,221を選択すると、01-40の7桁の2桁の数字の中でどのように表現できますか?乱数を別の基本形式に変換するにはどうすればよいですか?
プログラミング言語はPythonですが、任意の言語/疑似言語が役立ちます。
乱数を選んでその数を宝くじシステムの形式で表現したいと思います。例えば、宝くじシステムは、01から40までの2桁の数字の7つのグループを有し、可能な組合せの総数は163,840,000,000(40の7乗)である。ランダムな基数10の数字、たとえば453,867,221を選択すると、01-40の7桁の2桁の数字の中でどのように表現できますか?乱数を別の基本形式に変換するにはどうすればよいですか?
プログラミング言語はPythonですが、任意の言語/疑似言語が役立ちます。
したがって、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
とベース変更の難読化。これで達成しようとしていることは何ですか?ドメインをより密接にモデル化してみませんか?
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
を使用して見てみたいです。交換せずに集団から
標準ライブラリの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オハイオ州、非常に素晴らしい、私のくそよりはるかに良い! – wim
+1エレガンスと非ホイールリニューアルのため。 ( '_'をドントケアとして使うこともできますが、私はあなたができることを忘れていました)。 –
実際の宝くじではリピートが許可されていません。あなたもそれをコーディングする必要があります。 –
log2(40^7)は約37.3なので、最大値を整数として表すには38ビットが必要です。バイナリ表現には長い文字列を使用する必要があります。 –