Max8とPure Dataのジェネレート力向上のための[random]オブジェクトとRandom Seed
ナカジ(@cp_nakajun)です。
個人的に比較的よく使うPure DataとMaxの[random]オブジェクトについて
実は今まであまり気にせず使っていたので、今さら感はありますが[random]の挙動とrandom seedを設定することについて書いておこうと思います。
Max & Pure DataのRandom Object
MaxとPure Dataのランダムオブジェクト(random object)は名前のイメージどおり、乱数(ランダムに数字)を生成して出力するオブジェクトです。
使い方については割愛しますが、[bang]を入力するとオブジェクトに指定した範囲でランダムに数字を出力します。
この時[random]はオブジェクトを複製したり、パッチを開き直したりする度にリセットされ、基本的には毎回違う挙動(違う数字、順序)で出力します。
おかげでこれまで特に気にすることなく僕は安直に[random]オブジェクトを使ってきました。
ところが、というか実は
[random]オブジェクトには「seed」というアトリビュート(という言い方でいいのか?)があり「シード値」なるものを設定することができます。
この「シード値」random seedってなんでしょうか?
Max & Pure DataのRandom SEED
まず、MaxとPure Dataでの「シード値」の設定方法は以下になります。
- Max・PureData:[seed <数字>]の形式のメッセージを左インレットに入力
- Max:2つ目の引数としてオブジェクトに直接設定
そしてこの「シード値」をするとどのような挙動になるかと言うと
設定したタイミングでその値にシードがリセットされて毎回同じ挙動すなわち同じ数字が同じ順序で出力されます。
この挙動は設定したタイミングでリセットされるのでパッチを開き直すことでも同じ挙動が得られることになります。
Random Seed について
ここで少しだけRandom Seedについて触れようと思います。
あまりきちんと書けませんが、wiki「擬似乱数」を参照すると
真の乱数列は本来、規則性も再現性もないものであるため、本来は確定的な計算によって求めることはできない….
実際には確定的な計算によって求めている擬似乱数列による乱数。
とある、また
ランダムシードは、疑似乱数ジェネレータを初期化するために使用される数値です。 シードが疑似乱数ジェネレータで使用されるためには、ランダムである必要はありません。数生成アルゴリズムの性質上、元のシードが無視される限り、アルゴリズムが生成する残りの値は、確率分布に従って疑似ランダムな方法で生成されます。
wikipedia
ということから
コンピューターはすなわち計算機である以上、乱数の決定を「計算」によって行うことしかできないが、計算によって生成するための「素」になる(初期化)値。
これらのことからつまり、SEEDが同じなら同じ乱数列が生成されるということは理解できる気がしているし、シード値の数だけ乱数列のパターンがある
という感じのあやういかもしれない理解の仕方を僕はしているが、結果的にこの理解が誤りだったらごめん。
MaxとPure Data ヘルプの記述
MaxとPure Data のそれぞれの[random]オブジェクトのヘルプにはどのように書いてあるだろうか?
Max8
シードという単語の後に数字が続くと、乱数ジェネレーターの「シード」値が提供されます。
これにより、疑似乱数の特定の(再現可能な)シーケンスが発生します。
数値0は、システムの起動からの経過時間(予測不可能な値)をシードとして使用し、予測不可能な一連の数値を保証します。
この予測不可能なシードは、ランダムオブジェクトが作成されるときにデフォルトで使用されます。
Pure Data
乱数は、疑似予測可能な数のシーケンスを生成する複素方程式を介して生成されます。
各[ランダム]オブジェクトの方程式には、シーケンスを生成する方程式の変数の1つにすぎない「シード」が提供されます。
「シード」は、[ランダム]オブジェクトを含む各パッチの特定のパラメーターに基づいてPdによって生成されます。
1つのパッチ内に複数の[ランダム]オブジェクトが含まれている場合、それぞれが異なる「シード」を取得します。
まとめ:random オブジェクトの可能性
結果的にはここまで書いてきたことはヘルプにちゃんと書いてある。
きちんとプログラミングの勉強課程で「Random Seed」とかに触れてきた人にはアレなトピックですが、最初に書きましたが僕はこれまであまり気にしたことがなかったこの「Random Seed」。
なんで気にしてなかったか??
恥を忍んで言うと、「ランダムなのになんで毎回同じ値がでるんだよ!」って思ってたのでSeedを設定できる意味がまったくわかってなかったからです。
じゃあ、なんで逆に今気になったかというと
「パターン」は生成したいけど、そのパターンが気に入ったら「使いまわしたい」的なことをようやく思ったからです。
これについては今回はやめておきます。