WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:曜日別ランダム文字列の「複数」表示

0:[投稿] マキ [2005/06/10 23:20 ][環境:IE6 わからない]

「オブジェクトなJSの基礎講座」にて
「曜日別ランダム文字列の表示」を参考にさせて頂いたのですが、
例えば、金曜日に表示させたい5種類のテキストのうち、
重複させずに3つのテキストをランダム表示させるには、
どこをどうすれば良いのでしょうか?

今までjavascriptをコピー&ペーストでしか使用したことのない初心者なのですが、どうか御教授下さい。


1:[回答] 桜 [2005/06/11 19:00 ]

>金曜日に表示させたい5種類のテキストのうち、
>重複させずに3つのテキストをランダム表示させる

もっと的確に、正確に、表現してください。


2:[回答] NintendoPSP [2005/06/11 19:54 ]

> javascriptをコピー&ペーストでしか使用したことのない初心者なのですが
ソースを具体的に表示されるのがご希望の場合は、無視してください。

JavaScriptに限って答えるのが難しいのですが、
5種類から重複させずに3つ選択する場合は、
5種類から重複させずに2つ排除する、
と考えるほうが処理が軽くなると思います。

ランダムな数値を求めるのは、
かなり力のいる処理なので、なるべく少ない回数で行います。

さらに、
テーブルを利用されるとプログラム部分がすっきりします。
プログラム部分がすっきりする方が、間違いが少なくなります。

5種類のテキストに番号を割り振れば、
組み合わせは、以下の通り
0:0,1,2
1:0,1,3
2:0,1,4
3:0,2,3
4:0,2,4
5:1,2,3
6:1,2,4
7:1,3,4
8:2,3,4
一つの組み合わせをランダムに選択して、
それに対応する番号のテキストを表示させれば良いと思います。

順列で求めたい、
テキストが6種類になったら、どうするんだ?
という、つっこみは考慮に入れていません。


3:[回答] h [2005/06/11 22:42 ]

このページをお手本にしてらっしゃるのですね?。
http://www.parkcity.ne.jp/~chaichan/src/javasc23.htm

いろいろなやり方があると思いますが、ひとつの考え方として、

 ・1番目のメッセージを得て、変数に入れる。
 ・2番目のメッセージを得る。
 ・2番目のメッセージが、1番目のメッセージと異なるなら、変数に連結する。
 ・2番目のメッセージが、1番目のメッセージと同じなら、もう一度
  2番目のメッセージを得る。
 ・必要な数のメッセージが得られるまで、処理を繰り返す。
  
という繰り返し(ループ処理)をすることで、同じメッセージが重なることなく、必要な数のメッセージを得ることが出来ます。


    myFirstMsg = mes[yubi][rangeRandom(0,4)] + "_";

    do {
        myNextMsg = mes[yubi][rangeRandom(0,4)];    
        if ( myFirstMsg.indexOf(myNextMsg) == -1 ){
            myFirstMsg += myNextMsg + "_";
            k++;
        }else{
        }
    } while( k < 2)
    
    myMsgAry = myFirstMsg.split("_");

    document.write(myMsgAry[0]);
    document.write("<br>");
    document.write(myMsgAry[1]);
    document.write("<br>");
    document.write(myMsgAry[2]);
    document.write("<br>");
    }
    
    
myFirstMsg , myNextMsg , k , という 3つの変数と、myMsgAry という配列は、お手本のスクリプトには無いものです。
処理に入る前で宣言して下さい。

このやり方が マキさんの好みかどうか分かりませんが、もし分からない部分があれば、どこがどのように分からないのかを書いて下さいね。


4:[回答] ふじ [URL] [2005/06/12 04:45 ]

配列からランダムに数個取り出す、という場合、
(あまり配列が大きくなければ) 配列をランダムに sort してしまって、
最初から数個だけ取り出す、という方法があります。

ar = new Array(1,2,3,4,5);
sorted = ar.sort( function(a, b){ return Math.random() - Math.random() } );

これで sorted に ar をシャッフルした配列ができます。

蛇足ですが
>>2
> ランダムな数値を求めるのは、
> かなり力のいる処理なので、なるべく少ない回数で行います。
これについて、簡単に検証してみました。

d1 = new Date();
for(i = 0; i < 1000000; i++){
   Math.random();
}
d2 = new Date();
document.write( d2 - d1 );

このような JavsScript で計測したところ、
100万回 Math.random() を実行するのにかかった時間は
2〜5秒程度でした。

CPU: Athlon XP 1400+
Browser : Vine Linux 3.1R + firefox1.0.4
         Windows 2000 + IE 6.0
         Windows 2000 + firefox1.0.4
         WIndows 2000 + Opera7.23

もちろん CPU の速度に左右されることですが、
数十回〜数百回程度の実行については、それほど神経質になる
必要はないような気がします。
# クライアントサイドで動作するスクリプトですし……


5:[回答] マキ [2005/06/12 13:25 ]

いろいろなご提案ありがとうございます。

例えでは5つのテキストから3つ選択、としていましたが、実際には母集団となるテキスト数がかなり多いんです。また曜日ごとにテキスト数が異なるというのも問題でして…。


素人なりに皆様のご意見を参考にさせて頂いたのですが、一旦、二次元配列から離れて、他に良い方法がないか考えてみることにします。また、「重複させず」という条件が事を厄介にしているようなので、その条件はあきらめることも考えています。とはいえ、頭は破裂寸前です。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World