Perlクックブックのお題をPythonで解いてみた その16

レシピ2.6 乱数を生成する

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import random

# 25 <= n <= 75 の乱数を1つ生成する

print random.randrange(25,75+1)
print random.randint(25,75)

# a から z までの文字から10個を無作為に抽出する
str = "abcdefghijklmnopqrstuvwxyz"
listStr = [ str[random.randrange(0,len(str))]  for n in range(10)]
print ''.join(listStr)
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from random import Random

# 25 <= n <= 75 の乱数を1つ生成する
rand = Random()
print rand.randrange(25,75+1)
print rand.randint(25,75)

# a から z までの文字から10個を無作為に抽出する
str = "abcdefghijklmnopqrstuvwxyz"
listStr = [ str[rand.randrange(0,len(str))]  for n in range(10)]
print ''.join(listStr)


 さて、上の2つ、結果として同じ処理を行っている訳ですが、
ソースコードが、微妙に違います。

違う部分というのは、モジュールのインポート部分。
上の方のインポート部分が、

import random

なのに対して、下のものは

from random import Random

となってします。
これは、どちらもrandomモジュール内のRandomクラスをインポートしています。

 randomモジュールには、Randomクラスの他にWichmannHillクラスと
SystemRandomクラスが定義されています。

 下のソースは、この中のRandomクラスをインポートすることを、
プログラマが明示的に書いている形になります。
では、上のソースは、どのような仕組みになっているのかというと、
randomモジュールの最後の方で、実はRandomクラスを用いてインスタンス
生成しているのです。

random.py Line 828

_inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
randint = _inst.randint
choice = _inst.choice
randrange = _inst.randrange
sample = _inst.sample
shuffle = _inst.shuffle
normalvariate = _inst.normalvariate
lognormvariate = _inst.lognormvariate
expovariate = _inst.expovariate
vonmisesvariate = _inst.vonmisesvariate
gammavariate = _inst.gammavariate
gauss = _inst.gauss
betavariate = _inst.betavariate
paretovariate = _inst.paretovariate
weibullvariate = _inst.weibullvariate
getstate = _inst.getstate
setstate = _inst.setstate
jumpahead = _inst.jumpahead
getrandbits = _inst.getrandbits

この部分があるので、プログラマは、Randomクラスを明示的にインポートして
インスタンスを作ることなく、メソッドをしようすることが可能なのです。


(偉そうに書いているけど、これ、リファレンスにも書いてあるという事実)