隅田川沿いを歩きつつ

歩きながら考えたことや感じたこと

Pythonのrandomについて

Pythonのrandomがわからなかったのでまとめてみました。

p5.jsでrandomを使ったことがあったのですが、Pythonではちょっと違いました。

ざっくりと以下があるようです。

  • random.random()
  • random.uniform()
  • random.randint()
  • random.randrange()
  • random.choice()
  • random.sample()

使い方を確認します。

import random

まず、randomをインポートします。

インポートしないと使えないのは、なんか新鮮です。


random.random()

これで、0~1の乱数が返ります。


random.uniform(-1,1)

任意の範囲の浮動小数点を取得できます。


random.randint(0,10)

任意の範囲の整数値を取得できる。


random.randrange(0,10,2)

randintと同じように使いますが、3つ目の引数でstepを設定できます。

上のように[2]を設定すると偶数を取得できる。


あと、リストから要素を取り出せる[choice]というのがあるようです。

data=['札幌','仙台','東京','名古屋','大阪','広島','福岡']
random.choice(data)

sampleだと複数の要素が取り出せる。

第2引数は要素の個数。

random.sample(data,3)

choicesも複数の要素が取り出せるが、重複がある。

第2引数の[k]は要素の個数。

random.choices(data,k=6)

choicesは[weights]で重みを付けれる。

random.choices(data,weights=[1,1,2,1,1,1,1],k=6)

randomの種類、結構多いですね。。

Blenderでやってみた

Blenderで確認しました。

cube(四角)はrandom、sphere(丸)はrandom.uniformで位置を設定しています。

cubeはx軸のプラス方向のみになっていて、sphereはマイナスとプラスの両方になっています。

blender-python
cube→random、sphere→uniform

import bpy
import random

for m in bpy.data.meshes:
    bpy.data.meshes.remove(m)


def make_sphere(x, y, z):
    loc = (x, y, z)
    sphere = bpy.ops.mesh.primitive_uv_sphere_add(location=loc)


def make_cube(x, y, z):
    loc = (x, y, z)
    cube = bpy.ops.mesh.primitive_cube_add(location=loc)


def main():
    for i in range(30):
        make_sphere(
            random.uniform(-1, 1)*10,
            random.uniform(-1, 1)*10,
            random.uniform(-1, 1)*10)
        make_cube(
            random.random()*10,
            random.random()*10,
            random.random()*10)


if __name__ == '__main__':
    main()

また、「特定の分布に基づく乱数生成関数」というのがあるようです。

「独習Python」に載っていたのですが、よくわからなかったです。

わかったら改めてまとめます。