2017-06-02 12 views
0

私はクラスで特定のランダムシード237を使用するように頼まれましたが、正しく実装する方法はわかりません。たとえば、これは私のコードです。 Pythonの この例では、基本的に、k個の辺を持つm個のダイスを投げ、mの長さのタプルを返そうとしています。python 3で乱数の種にrandrange()を使用するにはどうすればよいですか?

import random 
rng=random.seed(237) 
# create random number generator 

def throwDice(m, k): 
    x = 0 
    L = [] 
    while x < m : 
     die = rng.randrange(1,k+1) 
     L.append(die) 
     x+=1 
    return print(tuple(L)) 
throwDice(11,5) 

しかし、コマンド・プロンプトが

die = rng.randrange(1,k+1) 
AttributeError: 'NoneType' object has no attribute 'randrange'` 

は私が間違って何の説明を取得でした:(

+0

シードは基本的に乱数発生器にどのようにランダムであるかを伝えています(同じシードでは常に同じ数字が選択されます)。 'die = random.randrange(1、k + 1)' – Kai

答えて

2

かなり簡単なエラーを示す保持:2行目には、オブジェクトを作成しています、rngという戻り値はrandom.seed(237)です。random.seedは常にNoneを返します。コードの後半で、rng.randrangeを試してみると、Pythonはattrを検索しますrngオブジェクトのrandrangeという名前のibute。しかしrngオブジェクトはNoneであり、randrange属性はありません。

rng.randrange(1, k+1)ではなく、実際にはrandom.randrange(1, k+1)となります。

rng=random.seed(237) 

rngでとても

+0

シードをインポートすると、コード内で参照する必要はありませんか? random.randrange()を使うことができますか? –

+0

遅い応答に申し訳ありませんが、はい。シードを設定してから乱数(または範囲)を求めて、自分で試すことができます。シードを同じ値に再設定し、別の乱数(または範囲)を求める場合は、同じ値にする必要があります。 – acdr

1

random.seed戻りNoneは、Noneに設定されます。そして、あなたの関数で

None.randrange(1,k+1) 

と呼ぶことを試みますが、それはうまくいきません。

また、print機能はNoneを返しますので、

return print(tuple(L)) 

None返します。あなたはそれを望んでいません。

修正されたバージョンのコードです。

import random 

random.seed(237) 

# create random number generator 
def throwDice(m, k): 
    L = [] 
    for x in range(m): 
     die = random.randrange(1, k+1) 
     L.append(die) 
    return tuple(L) 

print(throwDice(11, 5)) 

出力のPython 2では、あなたはこの出力を得る

(5, 4, 2, 2, 4, 1, 2, 5, 4, 5, 1) 

:私はサイコロの所望の数を実行するためにforループを使用しました

(4, 5, 5, 4, 1, 1, 4, 5, 3, 3, 1) 

をループは、whileループを使用するよりも優れており、手動で "ロールを数えてx += 1でカウントします。そのループではxの値を実際に使用しているわけではありません。その状況ではループ変数の名前として_を使用するのが一般的なPython規約です。我々は複数の独立した乱数ストリームを必要とするいくつかの状況で

def throwDice(m, k): 
    return tuple(random.randrange(1, k+1) for _ in range(m)) 

:、

for _ in range(m): 

FWIW、我々はジェネレータ式を使って、コンパクトにこの関数を書くことができます。 Randomクラスのインスタンスを作成することで簡単に行うことができます。クラスのコンストラクタはシードをオプションの引数として取ります。

import random 

# Create a random number generator, and seed it 
myrandom = random.Random(237) 

def throwDice(m, k): 
    L = [] 
    for _ in range(m): 
     die = myrandom.randrange(1, k+1) 
     L.append(die) 
    return tuple(L) 
+0

Python 3.6では 'random.choices'を使用して明示的なループを保存することができます。 –

+0

@Chris_Rands Trueですが、これは宿題なので、OPは' randrange'を使用する必要があります。 TBH、私は「選択肢」が存在することを忘れています。 :)この作業では、おそらく 'randint(1、k)'を使用します。 –

関連する問題