RSS

 

RSS


プ:乱数で順列を作る方法

  • いわいまさか
  • at 2008/7/12 10:29:29

 ゲームが作れるようになるまでがんばる日記toburauさんからトラックバックをもらった。ありがとうございます。

 プ:乱数の使い方がダメをダメじゃなくすにはどうすべきか?という話題。

①ここは基本に立ち戻ると。
  100個の中から1個を選びbox[0]に入れ、
残りの99個の中から1個を選びbox[1]に入れ、
残りの98個の中から1個を選びbox[2]に入れ、
 ・・・・・・
ということをやればよい。

 がしかし、toburauさんご指摘のように、ちょっとやっかいそうにも思う。「使ってない数字をプチプチ探さないと」とか、「リスト構造を導入せねば」などと。

②box内を並べ替える。
 toburauさん提示のようなboxにあらかじめ値を入れておいて並べ替えるのは良い方法。トランプのカードをシャッフルするのには近い感じ。次回の話題でも登場予定。

③ここでは①と②のあわせ技的方法を提示。

  100個の中から1個を選びbox[0]に入れ、
残りの99個の中から1個を選びbox[1]に入れ、
残りの98個の中から1個を選びbox[2]に入れ、
 ・・・・・・
   ということをやるのだが、それをbox内スワップを使って行う。

    for(int i=0; i<100; i++)
    {
        box[i] = i;
    }

    for(int i=0; i<100; i++)
    {
        int nokori=100-i;
 // どこから取ってこようかな?
        int pos= i +  (rand() % nokori );

        int temp = box[i]; // boxを空け渡し
        box[i] = box[pos]; // 選ばれた数字を入れて
        box[pos] = temp; // 空いたところに
              //  まだ選ばれてない数字を入れておく
    }

 ゲームが作れるようになるまでがんばる日記のソースをベースにちょっと改変。

/////

 この件に関してはこれでおしまい。

 しかし、実は、「麻雀ゲームの山をセットする」「ポーカーゲームのカードの山を積む」といった場合に乱数に関係する別な問題点がある。それはまた、次回。


  • コメント (0)
  • トラックバック (0)
トラックバックURL :
http://www.iwai-masaka.jp/tb.cgi/52290