配列の並び替え – プログラミング – Home

通知
すべてクリア

配列の並び替え


てつお
 てつお
(@てつお)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

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で抽出する文字の抽出の仕方に問題があるのでしょうか?

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


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

n*rand()%1+1 が常に 1 となっているのでしょう。

> teiji1 = teiji1 + pick1;

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
てつお
 てつお
(@てつお)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

επιστημηさん、PATIOさん、早速ありがとうございます。

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> 前者のrand()%1は1未満の小数を表現したつもりなんですが、0になってしまうのでしょう
か・・・。

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


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

> 前者のrand()%1は1未満の小数を表現したつもりなんですが、0になってしまうのでし
ょうか・・・。

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


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

詳しくはみていませんが、ロジック的にも問題点があるようなので指摘を。

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

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

n未満の乱数i,jを生成し、i番目とj番目を入れ替える

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました