配列の並び替え

[戻る]
てつお 2004/11/08(月) 16:57:00
VC++6.0を使っております。
forループを使った配列の並び替えを考えています。
MSDNなどで調べてみましたが、如何せん素人なのでよくわかりません。
どなたか、ヒントを下さる方がいたら、何卒宜しくお願いします。

コードは以下の通りです。

int n = 7;
CString cl="ABDEFGHJ";
CString pick1;
CString teiji1;

srand( (unsigned) time (NULL) );
     
 for(int i=0; i<8; ++i)
 {         
  int pick = ceil( n*rand()%1+1);
  pick1 = cl.Mid(pick,1);
  teiji1 = teiji1 + pick1;
  n=n-1;
 }  

”ABDEFGHJ”という文字列をランダムな順序(たとえば”DBEGHFJA”
など(文字の重複なし))に並び替えたいと考え、このコードを書いてみたのですが、
出力をすると”BBBBBBBB”になってしまいます。
乱数の発生の仕方に問題が問題があるのでしょうか?
それとも、pick1で抽出する文字の抽出の仕方に問題があるのでしょうか?

教えていただけたら幸いです。

επιστημη [E-Mail] [HomePage] 2004/11/08(月) 17:06:29
n*rand()%1+1 が常に 1 となっているのでしょう。

> teiji1 = teiji1 + pick1;

これでは入れ替えになっていません。
でたらめに選んだn番目の文字を連結しているだけ。

PATIO 2004/11/08(月) 17:16:00
演算子の優先度を考慮に入れて計算結果がどうなるかをきちんとシュミレーションしてみ
る事。
実際に今のロジックでどういう風になるのか、机上でシミュレーションしてみる事。
机上でシミュレーションする自信が無いのであれば、デバッガで実際にワンステップずつ
追っかけて見ましょう。
なんにせよ、自分が書いたプログラムがどう動いているのかを理解しないと先に進めませ
ん。

てつお 2004/11/08(月) 17:30:17
επιστημηさん、PATIOさん、早速ありがとうございます。

やはり、n*rand()%1+1とteiji1 = teiji1 + pick1の部分がまずいのですね。
前者のrand()%1は1未満の小数を表現したつもりなんですが、0になってしまうのでし
ょうか・・・。
また、後者は以前VBで表現したものをそのまま転用してしまったので問題があるのだ
ということはわかりました。

ただ、VCを学び始めて間もなく、牛歩のような進歩なものですから、どう表現すれば
いいか、もう少しじっくりと考えてみようと思います。

επιστημη [E-Mail] [HomePage] 2004/11/08(月) 17:42:49
> 前者のrand()%1は1未満の小数を表現したつもりなんですが、0になってしまうのでしょう
か・・・。

その'つもり'が正しいか、確認/検証してください。

KING・王 2004/11/08(月) 17:42:53
> 前者のrand()%1は1未満の小数を表現したつもりなんですが、0になってしまうのでし
ょうか・・・。

MSDNより、
> int rand( void );
とrand()は定義されています。
よってint型の値を1でわったあまりは、0となります。

KING・王 2004/11/08(月) 17:56:58
詳しくはみていませんが、ロジック的にも問題点があるようなので指摘を。

仮に1〜8の中の数値をランダムに発生させる関数が存在したとして、
それを8回実行しても、必ず1〜8の各数値が1回づつ出るとは限りません。
(というか、そうなることはほとんど無いと思います。)

てつおさんのなさろうとしていることは、並べ替えなので、
同じ文字を2回以上使用し、1回も使用しない文字がでてはダメだと思いますが、
提示されている例では、そのことが考慮されていないようです。

修正されるさいには、その点にも注意して下さい。

επιστημη 2004/11/09(火) 08:06:05
n未満の乱数i,jを生成し、i番目とj番目を入れ替える

てのを何度か繰り返すだけじゃないかと。

古いスレッドには追加発言できません。