• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perl ランダム 0と1 かぶり)

Perlでランダムに0と1をかぶらずに出力する方法

このQ&Aのポイント
  • Perlのランダム関数を使用して、0と1をバラバラに出力する方法について教えてください。
  • 現在のコードでは、稀に0と1がすべてかぶる現象が発生しています。
  • 0(□)はかぶらないようにする方法を教えてください。

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

  • ベストアンサー
回答No.2

□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文字づつ取り出せばよいかと。

perlhogehoge
質問者

お礼

ありがとうございます!! 実行できました。 0がかぶることなくできるようになり助かりました! 文字はsubstrで1文字ずつ取り除きました。

その他の回答 (1)

  • kichi8000
  • ベストアンサー率41% (660/1584)
回答No.1

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

perlhogehoge
質問者

お礼

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

関連するQ&A