プレイ日記
しんいち stgf1080
#トピ立て中なのでこちらで。 配列の中身をランダムに並べ替えたくて、できたのが画面のプログラムなんですけど、やってることは値の位置をランダムに決めてその値を取り出し、ユーザ関数でその値を削除した配列を返す。それを要素数分繰り返す。としています。 できてるのでこれで良いっちゃ良いんですけど、最初に思い付いたのは、再帰呼び出しだったんですよね。再帰使えば簡単だと思ったんだけど、全然思い付かなくて(老化かな^^;)。 何かもっと良い方法(再帰に限らずでも)ありましたら、アドバイス頂けると幸いです。
5そうだね
プレイ済み
返信[1]
親投稿
配列の中身をランダムに並び替えたいというと… 1.同じ大きさの数値配列を作り 2.各要素に乱数を入れる 3.それをキー(?)にして元の配列をSORTする とか思いついたけど…(欠点:並びかえる配列の大きさに応じて一時的にメモリを食う)
2そうだね
未プレイ
返信[2]
親投稿
ポコきち pokokichi
SWAPを使って作ってみました。 欲しい情報でなかったらすみません。
3そうだね
プレイ済み
返信[3]
親投稿
しんいち stgf1080
自分と違ったアイデア、どちらもためになります。 あまさとさん> 私には2.3.の具体的なコードが思い浮かばなかった^^; まぁメモリ食うのは今のところ気にしてません。 ポコきちさん> スッキリしたアイデアですね。ただちょっとかき混ぜ具合?が足りなくないかな。 ランダムに配列を並びかえるには、今回の場合なら0~9の数字をRND()10回実行して10通りにしたい。つまり10回実行したうち4が2回出て、7が1回も出ないとかだとまずい。というところがポイントだと思います。 と、ここで気づいちゃったんだけど、別に配列並び替えにこだわる必要なかったかな^^;。 先に書いた通り、RND()10回実行して数字が被らず10通りになれば良いだけの話だったか。。。 (やっぱり老化かな^^;) あらためて、配列関係なくアイデアお寄せ頂ければ幸いです。
1そうだね
プレイ済み
返信[4]
親投稿
みなつ tksm372
私はポコきちさんの方法でできてるとおもいますよー^^ RNDで7が1回もでなくても、Iは0から9まで変化するので、A[7]も1度はSWAPされますよね(≧∇≦)b SWAP A[0],A[3] SWAP A[1],A[4] ←A[4]の交換1回目(RNDが4) SWAP A[2],A[5] SWAP A[3],A[2] SWAP A[4],A[1] ←A[4]の交換2回目(Iが4) SWAP A[5],A[4] ←A[4]の交換3回目(RNDが4) SWAP A[6],A[9] SWAP A[7],A[8] ←A[7]の交換1回目(Iが7) SWAP A[8],A[6] SWAP A[9],A[0] ちなみに、あまさとさんの方法はとてもスマートです(*´▽`*) FOR I=0 TO LEN(A)-1:B[I]=RNDF():NEXT:SORT B,A ←Bの順でAも入れ替わる
2そうだね
プレイ済み
返信[5]
親投稿
ポコきち pokokichi
みなつさん、共感かな?ありがとうございます。 確かに、しんいちさんの言われる通り同じデータが何度も選ばれる可能性がありますね。 こういうのはどうでしょうか?
2そうだね
プレイ済み
返信[6]
親投稿
しんいち stgf1080
おおぉ、詳細な解説ありがとうございます。最近こういった根本的なアルゴリズムなかなか思い付かないというか思い出せなくて。昔散々やったはずなんだけどなぁ。 数当てゲームからやり直すか^^; #数当てゲームで思い出すのは、私の場合 #ファミコンの女神転生2。確か0~7の数字 #3桁をなるべく早い段階でぴったり当てれば #良いアイテムもらえるんだったかな。 #2回目で当たってすごく喜んだ覚えが。 #後にTVでぬめろん?とかってのもあったっけ。
1そうだね
プレイ済み
返信[7]
親投稿
しんいち stgf1080
#おっと前後してた。 さてさて、これからじっくりみなさんのアドバイスを元にお勉強し直したいと思います。 ちなみにみなつさんが示してくれたあまさとさんの案の例ですが、B[I]に乱数入れた時点で。。。。。ってRNDFだから被ることまずないのかぁ~。そっかぁ~。やはり非常にためになる。
2そうだね
プレイ済み
返信[8]
親投稿
みなつ tksm372
ですです、RNDFなので被らなそう、という感じです(*´▽`*)
2そうだね
プレイ済み
返信[9]
親投稿
しんいち stgf1080
あれからにわかランダムマニアとなりまして、一晩寝ながら考えてみました(^^) ポコきちさんのSWAP案だと、1つの配列内で入れ換えてるので、どうしても1度入れ換えられた値が再び入れ換えられる、また1度も入れ換えられない値も出てくると思うので、まんべんなく入れ換えようとすると悩ましいですね。 みなつさん解説で、Iは確かに0~9全部の値になりますが、そのIの示す配列内の値は、既に入れ換えられてたり1度も入れ換えられてなかったり。 ただ、それもランダムな結果だと考えればそれで良いのかもしれません。メモリ効率良いですし。 メモリのこと考えればポコきちさん案、スッキリ短く書きたければあまさとさん案とするのが良さげですね。 で、今回の私の案。もう並べ替えじゃなくなっちゃってます^^; 文字列で処理することで最初の案の配列削除する関数は不要になりましたが、メリットは・・・う~ん^^;
2そうだね
プレイ済み
返信[10]
親投稿
みなつ tksm372
なるほど、しんいちさんの方法は「手札の中から、ランダムに1枚ずつ取り出す」というやり方なんですね!うん、確かにスッキリしますね(≧∇≦)b ちなみに、S$[番号]=""で、文字列中の文字を消せるというのは知りませんでした!べんりー(*´▽`*)
2そうだね
プレイ済み
返信[11]
親投稿
しんいち stgf1080
更にスッキリさせて関数化してみました。今作ってるゲームではこれにしとこうかな。 しかし最初に思った再帰呼び出しは何だったんだ?たぶん昔それ使って数当てゲーム作ったことあったんだろうなぁ自分。昔すぎてもう忘れちまったわい^^; あらためてランダム考えてみると、数当てゲームって意外と難しいんじゃないかと思えてきた。よく初心者に、とりあえず数当てゲーム作るの薦めてるの見かけるけど、それって意外とハードル高いのかも。何というか、ひらめきが必要というか。実はスプライトジャンプさせたりする方がハードル低いんじゃないかなぁって。 余談でした。
2そうだね
プレイ済み