【Arduino】Arduinoのプログラミングでランダムを作る!

秋空を眺めるのも素敵なよりみちですよね!今日は夜明け前から眺めておりました!
どうもヨリミチ団です!

今回は音の再生かた一旦離れて、ランダムについて考えたいと思います!
そう、ランダムとは数字を不規則に選び出すプログラミングを思い浮かべますよね?

便利な世の中に鳴ったもので、ランダムは既に多くの種類が用意されております。
日本語に置き換えると[乱数]と言ったりもします。
ベタなプログラミングに


long randNumber;

void setup() {
Serial.begin(9600);
randomSeed(analogRead(0)); // アナログノイズといいますか、触れていないアナログピンにはうっすらノイズがありそれを利用しらランダム装置です
}

void loop() {
randNumber = random(50);
Serial.println(randNumber);
delay(1000);
}


なんてものがあります。
野生のカンでもわかりやすい!ランダムで50までの数字を選びだすものでございます。
1000㍉秒(1秒)おきに0〜50までの数を書き出し続けるという代物。
そう、もう既にランダムは目の前にあるのです!

じゃあコレを利用してしまえばいいや…

それも1つの正解です。

しかし、この乱数は稀に同じ数字を連続して弾き出すこともあります。
カードを一枚引いて、それをまた山に戻して引き直すことと同じだからです。

私はそれが嫌だった…

例えばすべてのカードが5枚しかない時、同じカードを引いてしまう確率が非常に高まるからです。
これを音源のランダムに当てはめたらどうでしょう?
同じ音源が頻繁に流れてしまうのは興ざめではありませんか!

ということで、いきなりですが私はこう書いてみました


while(j == k)j = random(1, 7);
Serial.println(j);
if(j == 1)playcomplete(“A.wav”);
else if(j == 2)playcomplete(“B.wav”);
else if(j == 3)playcomplete(“C.wav”);
else if(j == 4)playcomplete(“D.wav”);
else if(j == 5)playcomplete(“E.wav”);
else if(j == 6)playcomplete(“F.wav”);
else if(j == 7)playcomplete(“G.wav”);
justpressed[0] = 0;
k = j;


例えばボタン1に7つの音源を当てはめて、ボタンを押す度に7つのトラックをランダムに再生したい!けど、連続して同じ音源は流したくない!
そんなプログムです。便宜上音源の名前ををA.wav〜G.wavに変更しましたので、確認の際は各自で以前ご紹介した変換をして用意してみてください。(単純に既にある.wavの名前をA〜Gにしてしまっても大丈夫です)
jとkという数字があります。
jの数がkと同じ時、再びランダムに数字を弾き出すというものです。
これにより乱数で連続した数字を検出した時、それを確定する前にもう一度ランダムの計算をしてくれます。

意味がわからないかもしれませんが、これはそういう物なのです。
では一歩引いたプログラミング図を示してみます


byte j= 0;
byte k= 0;

void loop() {
digitalWrite(12, HIGH);
if (justpressed[0]) {
while(j == k)j = random(1, 7);
Serial.println(j);
if(j == 1)playcomplete(“A.wav”);
else if(j == 2)playcomplete(“B.wav”);
else if(j == 3)playcomplete(“C.wav”);
else if(j == 4)playcomplete(“D.wav”);
else if(j == 5)playcomplete(“E.wav”);
else if(j == 6)playcomplete(“F.wav”);
else if(j == 7)playcomplete(“G.wav”);
justpressed[0] = 0;
k = j;
}
}


最初にjとkを定義してあげます。
byte j= 0;
byte k= 0;
というのはj、kという数字は0〜255までの整数を扱いますと言うものです。
byteに似たもので[int]や[char]というものもありますが、byteはバイトデータに格納した8ビット整数です。
0~255と書きましたが、これは-128〜127までの数値であるとも言えます。
128という数字はとても親近感が湧きます。これは2の8乗=256でそれを2で割ったところが128となります。知っている人であれば、MIDIなんかも最大値は127ですよね。
そこを例えばint型を利用すると、intは32ビット整数(-2147483648~2147483647)となり、無駄に幅を取ってしまいます。

今回扱う数値はたかがしれているので、byteを使う方がかえって処理が少なくて済むと考えられます。

という自己完結ですが…
今回はこれが最適配置なのでは?という程度に留めてさらっと読んでいただければ幸いです。
上記のランダムのプログラムは1〜7までの整数しか扱いません。

今のわかりにくい説明をアタマの片隅においておいていただきつつ、全文を記載します

これでボタン1(Analog0とGND)を押したときに1〜7の連続しない乱数が生成されることになります。
検知するたびに次の曲を再生するものです。
もしも再生完了してから次のトラックを再生させたい時は playfile を playcomplete と書き換えてください。

これは是非コピペで良いので自らご確認していただければと思います。

しかし、観察眼のある方は気が付くと思います…
乱数なのになんだか傾向があることに…

つづく…

成功は“ランダム”にやってくる! チャンスの瞬間「クリック・モーメント」のつかみ方

新品価格
¥1,836から
(2016/11/5 00:17時点)

この記事が気に入ったら
いいね ! しよう


PAGE TOP