こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perl ランダム 0と1 かぶり

いつもお世話になっております
ご教示お願い致します。

□←0
■←1

とします。
この0と1をランダムに5こでるようにします。

例1)
□■■□■
例2)
■■□□□

このようにバラバラに出現させることができました。
しかし、
極稀になのですが、
□□□□□や■■■■■
とすべてかぶることがあります。

この■(1)はすべてかぶってもいいのですが、
□(0)はかぶらないでほしいのです

まずそのソースが下記・・・↓
srand(time()^($$ + ($$<<15)));
our $val1 = int(rand(2));
our $val2 = int(rand(2));
our $val3 = int(rand(2));
our $val4 = int(rand(2));
our $val5 = int(rand(2));

0と1が必ずバラバラになるようにするにはどのように
するのでしょう?

投稿日時 - 2017-08-31 13:48:06

QNo.9369212

困ってます

質問者が選んだベストアンサー

□or■の2つの状態を 1bit(2進数)に割り当てると それが5つなので、
5bitのデータで表せることになりまますので、
rand(2)を5回実行すのではなく
特定のものを除外した5bitデータを1度のrandで生成すれば 簡単だと思います。

つまり、5つの□or■を、10進数で示すと
□□□□□=0
□□□□■=1
□□□■□=2
□□□■■=3
...
■■■■■=31
の0~31となりますのが
このうち □□□□□=0  のみを除外したいなら、
1~31をrandで生成すればよいことになります。

これは
$val = int(rand(31)) + 1;
(rand(31)で0~30の範囲の返り値をもらって、それに+1)
ですので、
あとは、この値を、2進数に分解して各bitが0なら□, 1なら■とすればよいかと。
たとえば、
  1→00001 →□□□□■
...
 25→11001→■■□□■
...
 31→11111→■■■■■
という形です。

10進数から5つの0or1への変換は
$bin = sprintf ("%05b", $val);
で5桁の2進数の文字列にしてから、1文字づつ取り出せばよいかと。

投稿日時 - 2017-08-31 15:13:29

お礼

ありがとうございます!!
実行できました。
0がかぶることなくできるようになり助かりました!

文字はsubstrで1文字ずつ取り除きました。

投稿日時 - 2017-08-31 15:27:15

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

かぶらなくなるまで「やり直しループ」させる

投稿日時 - 2017-08-31 14:20:40

お礼

ご回答ありがとうございます・・・

IFで全てが0だったとき~するという処理は試してみたのですが、
そこにどうループを埋め込めばいいのかわからないです・・・

投稿日時 - 2017-08-31 14:52:00

あなたにオススメの質問