- 締切済み
複数の異なる結果を表示するランダム表示
AS2.0で、占いflashを作っています。 30個の占い結果の中から、ランダムで結果を表示するといったものです。 現在、途中まで制作しておりますが 30枚の中から1枚のカードを引いて、ランダムで1つの結果表示というのはできるのですが 30枚の中から3枚のカードを引いて、それぞれ3枚とも違う結果を表示するというのができません。 3つともそれぞれ毎回30個の結果の中からランダムで選択しているので、たまに同じ内容が表示されてしまいます。 結果が被らないようにするには、どういった制作方法がありますでしょうか? もし、お解かりになる方がいらっしゃいましたら、ご教授いただけたらと思います。 何卒よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1です。 私がいつも使う簡易的な方法を書き忘れていましたので 方法を追加します。 配列に30個の何か(何でも良い)を入れて spliceメソッドでランダムな要素を3回抜き取っても良いと思います。 ご質問には 具体的に何をどのようにして表示させているのかを書かれていないため 回答としても具体的な方法は書けませんが 例えば次のような感じです。 //------------------------------------- //配列「arr」を作成 var arr:Array = new Array(); //「arr」の各要素に1~30の数を入れる for (var i:Number = 0; i<=29; i++) { arr[i] = i+1; } //3回ループ for (i=0; i<=2; i++) { //変数「rnd」に配列の要素数内のランダムな整数を取得 var rnd:Number = Math.floor(Math.random()*arr.length); //「rnd」からランダムな要素を1つ抜き取りその要素を取得 var num:Number = Number(arr.splice(rnd, 1)[0]); //出力窓に出力してみる trace(num); } //------------------------------------- 仮にもし 内部が 30フレーム のムービークリップ「mc0」「mc1」「mc2」があったとして, それらムービークリップ内をランダムなフレームで停止させるのでしたら 上記スクリプトの //出力窓に出力してみる trace(num); の部分を //この階層にある「mc0」~「mc2」内をそのフレームで止める this["mc"+i].gotoAndStop(num); のように変えれば良いだけです。 実際には何をどのようにして表示させているのかわからないので どのように変えるべきかは知りませんが。 なお, 最初に「簡易的な方法」と書きましたが 上記spliceメソッドを使う方法で 例えば1000文字のランダムシャッフルをするなど 大量な情報を処理しようとすると 配列の大きさを変えるためか結構時間がかかるのです。 大量な情報を処理する場合は #1に書いた「配列を偏りなくランダムに並替える」の方が早いです。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
ご質問の点に関しては 色々な考え方(アルゴリズム)がありますが, その中でもなかなか良いと思われる1つの方法です↓。 「FN0212003 - 配列を偏りなくランダムに並替える - Flash テクニカルノート」 http://fumiononaka.com/TechNotes/Flash/FN0212003.html ↑これを単純に見れば 3コの選択肢を並べ換えているだけのように見えるかもしれませんが 例えば 30コ の選択肢を並替えて 先頭から 3 コを取り出しても良いですよね? その他, 30コのMCに(例えばという意味のMC)に 固有のランダムな数のプロパティをあらかじめ与えておいて その固有のランダムな数のMCをバブルソートしても良いと思います。 その他..., 無限ループに陥る可能性がないということもないのであまりお薦めはできませんが 前に引いたくじであれば再び引き直すというような方法も無きにしもあらずだと思います。 (たいていの場合は上の2つより早く決着が付く場合が多いとは思いますが,そもそもランダムとは同じ数が10000回以上連続して出る可能性もなきにしもあらずですから,保証は不安定です。)