映画のエンドロール観る派?観ない派?

c言語で、hairetu[8][8]があったとして、その中でいくつかの中に1が入っていて、そのほかは0が入っているとします。

0 1 2 3 4 5 6 7
0|1 0 0 0 1 1 1 0
1|1 0 0 0 0 0 0 1
2|0 1 1 0 1 0 1 1
3|・・・・・・・・・・・・
4|・・・・・・・・・・・・
5|
6|・・・・・・・・・・・・
7|0 1 1 0 0 0 0 1

という具合です。
そのとき、ランダムで1を1箇所しかない状態にしたいのですが、
自分が考えた方法だと無駄が多いので、もっとスマートな方法はないかと思い質問させてもらいました。基本的な質問なのですがよろしくお願いします。

以下自分が考えた方法

[64][2]の配列を作成し、上記の[8][8]の配列をfor文で解析し、1が入ってるところの番号を配列[64][2]に格納する。
乱数を使い、ひとつだけ選択する。

A 回答 (3件)

カテゴリをC言語にしてらっしゃいますが、その問題はC言語に限った問題ではないでしょう。


まず、最適なアルゴリズムを選ぶのに重要なことは、0と1の分布がどうなっているかです。1の数が非常に少ない場合は、質問者さんの出したようなアルゴリズムでするしかありません。
1の割合がもっと多い場合は、先に位置を乱数で選択して、そのあとその位置の値が1かどうか判定するという乱択アルゴリズムのほうが効率がいいでしょう。
他には、配列に入っているという事ならば、並列演算で1の入っている領域を限定出来れば効率化できるかもしれません。
    • good
    • 0
この回答へのお礼

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

確かによく考えたら言語関係なかったですね
カテゴリーミスすいません
さらに1の数の多少を書いておらず、条件が不足しておりました。
重ねてすいません
図ではあんなに調子づいて1を書いてしまいましたが、
数はほとんど一桁に成りそうなので、
自分のやり方でやってみます。

また、並列演算というのはやったことがないので調べてみようとおもいます。

お礼日時:2012/06/11 04:31

「ランダムで1を1箇所しかない状態にしたい」というだけなら、初期値は一切関係ありません。


全体をゼロクリアしてからランダムに1か所だけを1にすればよいでしょう。
    • good
    • 0
この回答へのお礼

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

説明が下手くそでした。
大変申し訳ないです。

全体からではなく、1が入っていた場所から
ランダムで一ヶ所だけ1にする

と説明するべきでした。

お礼日時:2012/06/11 04:38

自分で考えた結果があるので回答します。


条件足らなかったら補足してください。

あえてざっくり書きますけど、
「とりあえず1マス選んで、1なら他を全部0にする、0だったらもう一回選ぶ」

これだと確率のばらつきもよさそうです。

ちなみに、計算機的に考えると、場所を決めたあとは
全部まっさらに0にしてから1の場所を改めて1にする方が多分キレイで早いです。
    • good
    • 0
この回答へのお礼

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

1の数が多い時はそのやり方が良さそうですね
大変参考に成りました。

お礼日時:2012/06/11 04:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!