2008年4月23日水曜日

複数の要素をランダムシャッフル をC#で作ってみた

まさかの連日の更新
きっと明日は嵐ですね.

で,本題
昨日C#で実装したところを備忘録的に記述

二つの配列 A[MaxA],B[MaxB]をシャッフルしてランダムな順番で呼び出したいのですよ.
そういうものを作りたかった.

んで二つの配列はdouble型のkeysってメンバ変数を持ってますよと
そんでもって,そのkeysには,ランダムな値が入ってます.double型でねもちろん.


double [MaxA + MaxB] key = new double[]; //シャッフル用のkey
int [MaxA + MaxB]iD = new int[]; //シャッフルした時のID

//key[]にそれぞれの配列のkeyを代入
for(int i = 0;i < MaxA + MaxB;i++)
{

    if(i < MaxA ) key[i]=A[i].keys;
    else key[i]=B[i-MaxA].keys;
    iD[i]=i;
}

//上で作ったkeyの順番にIDをソート.昇順に かなり便利な関数
Array.sort(key,iD);

//いよいよ並べ替えられたものを呼び出し
for(int i=0;i < MaxA+MaxB;i++)
{

    if(iD[i] < MaxA)
    {

      A[iD[i]]の処理
    }
    else
    {

      B[iD[i]-MaxA]の処理
    }
}


ってな感じに作ってみた.
全要素を混ぜたランダム呼び出し.名称はいい加減

これで,今までできなかったことができるようになって嬉しいんですよ.
んでも,すぐ忘れそうなのでここに書いときます.
二個以上の要素も,おんなじ考えで出来るはず.

要は,乱数による並び替え+全部を通し番号で覚えてくれる変数に代入.

まぁ,で,なんかもっといい方法があるなら教えてほしいのですよ.
正直,オレ程度のコードを載せるのは恥ずかしすぎますが….
コメント等お待ちしております.

5 件のコメント:

匿名 さんのコメント...

うごけばいいのさっ!

匿名 さんのコメント...

これ・・・コンパイル通った?
double [] key = new double[MaxA + MaxB];
だと思うんだが・・・。

匿名 さんのコメント...

HAHAHA・・・。

所詮文系は文系だということを
実感しました。

匿名 さんのコメント...

別に記事のままでも問題ないのだが,double のkeyとかもって無くてもできると思う.Cっぽい偽コードを書くと(Cじゃ const使えないし)

const int N = MAX_A + MAX_B;
int id[N];
int a, i;
for (i = 0; i < N; i++) id [i] = i;

// シャッフルする
for(i = 1; i < N; i++){
  a = rand()%(i+1);
  swap(id[i], id[a]);
}

//記事のと同じ.
for(i = 0; i < N; i++){
  if (id[i] < MAX_A) {
   A[id[i]] ...
  } else {
   B[id[i] - MAX_A] ...
  }
}

Ultra さんのコメント...

>pakuchan さん
まぁね~
ごもっとも

>sub さん
ああ,本当だ
これは通らんね.
実際のやつではちゃんと書いとりました.
blogへの記載ミス.はずい.
敢えて,直さないけどね.
ご指摘ありがとうございます.

>元刑事の社長 さん
あまりにも専門分野過ぎますからね.
わざわざコメントありがとうございます.

>orca さん
ああ,なるほど.
swapを使う方法もあるのか
ソートしてくれるっつうのを見つけたから,
使ってみたかったんだよね.
かなり,勉強になります.
ありがとうございました