http://www.eweb-design.com/affiliate/0303_jr.html
こちらのサイトのソースを参考にランダムに複数のリンクを表示したいと考えています。
このソースだとランダムに複数のリンクを表示できたのですが、重複しないように表示ができません。
そこでいくつか調べてみたところ、重複しないようにランダムに複数表示するスクリプトを発見しましたが、あまりシンプルに作成されていないため使用するのをやめました。
やはり、重複しないという条件をつけるとスクリプトは長くなってしまうのでしょうか?
このスクリプトは諦めて他のスクリプトを試すべきなのでしょうか?
JavaScriptに詳しい方、よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
<script>
/**************************/
/*最初にシャッフルする方法*/
/**************************/
var list = [0,1,2,3,4,5,6,7,8,9];
//Fisher-Yates shuffle
var i = list.length;
while(i > 1){
var j = Math.floor(Math.random() * i);
i--;
var tmp=list[j]; list[j]=list[i]; list[i]=tmp; //Swap
}
alert(list.toString());
/*******************************/
/*1つずつランダムに取り出す方法*/
/*******************************/
function pick_random(list){
if(list.length<=0){return;}
//ランダムに1つ選ぶ
var idx = Math.floor(Math.random() * list.length);
var retVal = list[idx];
//選んだ要素を削除(splice使って削除してもよい)
list[idx] = list[list.length-1];
list.length--;
return retVal;
}
list = [0,1,2,3,4,5,6,7,8,9];
var shuffle_list = [];
for(i=list.length;i>0;i--){
shuffle_list.push( pick_random(list) );
}
alert(shuffle_list.toString());
</script>
> var j=Math.floor(Math.random() * 20);
> var tmp=h[j]; h[j]=h[i]; h[i]=tmp;
この方法、実は要素数が3以上の時は全ての組み合わせが等確率で出現しません。
例えば要素数が3の時は、
4/27の確率で出現する組み合わせと、5/27の確率で出現する組み合わせが存在します。
//確認用コード
<script>
var dist = {};
for (var n=0;n<27000;n++){
var h=[0,1,2];
for (var i=0; i<3; i++){
var j=Math.floor(Math.random() * 3);
var tmp=h[j]; h[j]=h[i]; h[i]=tmp;
}
dist[h.toString()] = (dist[h.toString()]||0) + 1;
}
var message = "";
for(var pattern in dist){
message += pattern + ":" + dist[pattern] + "\n";
}
alert(message);
</script>
解説付きのサンプルでありがたいです。
ですが、このサンプルを改良する技術を持っていないので、初心者サイトを参考に改良していきたいと思います。
No.2
- 回答日時:
かき混ぜるほうの一例
頭から必要な数だけ取り出せばよいです。
<html>
<<script type="text/javascript">
var h=[];
for (var i=0; i<20; i++) h[i]=i+1;
document.writeln('シャッフル前:' + h.toString());
for (i=0; i<20; i++){
var j=Math.floor(Math.random() * 20);
var tmp=h[j]; h[j]=h[i]; h[i]=tmp;
}
document.writeln('<p>シャッフル後:' + h.toString());
</script>
</html>
具体的な例を出していただき、ありがとうございます。
数字のランダムとテキスト(リンク)のランダムでは書き方が異なるのでしょうか?
無知で申し訳ないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ExcelVBAでリストの項目に必要数と同じ手配数を分配していくマクロを作りたいです。 1 2022/07/29 18:36
- Excel(エクセル) Excelの関数詳しい方お願いします。 13 2023/01/18 21:11
- Excel(エクセル) 重複データの抽出について 2 2023/07/21 14:52
- Access(アクセス) Access2016でフォーム内にExcelの複数シートを 表示させるイメージで複数テーブルの デー 1 2022/11/25 15:30
- SEO googleサーチコンソールで、重複URLが多数発生、その修正方法について 2 2023/06/23 16:15
- その他(クラウドサービス・オンラインストレージ) Googleスプレッドシートについて 1 2022/05/11 15:26
- Excel(エクセル) EXCELピボットテーブル(複数アイテム) 1 2023/04/27 12:15
- Chrome(クローム) Chromeの描画領域を2分割して異なるスクロール位置を同時に表示させることはできますか 1 2023/03/01 16:53
- iPhone(アイフォーン) 同じ写真と動画をiOSが検出する便利な機能 写真のアルバムタブにて、画面を一番下までスクロールすると 3 2023/01/23 15:41
- Excel(エクセル) Changeイベントを使用して重複チェックをしたい 2 2023/08/02 11:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#OpenCv V4にのエラーに関する...
-
google apps scriptの終了のさせ方
-
ローカルにあるファイルを検索...
-
1日1回引けるJavaScriptおみく...
-
var_dumpのdump意味はを知りた...
-
gas スプレッドシートがアクテ...
-
翌月を取得するGASが分かりません
-
イベントが初めの一回しか起き...
-
どうすれば良いでしょうか?
-
HTMLにWSHを組み込む
-
C# 演算 奇数と偶数 表現の仕方
-
1日1回だけ引けるjavascriptお...
-
jqGridについて
-
Google Maps V3のズームの規制
-
javascriptでテーブルに追加し...
-
GASでundefinedエラーが出ます
-
ASP.NETのコントロールの値をJa...
-
C言語の質問です HTMLでこのよ...
-
なぜmatchメソッドがエラーにな...
-
指定日数経過でHTML上のデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
var exports = exports || {}; ...
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
GASでGoogleフォームの自動返信...
-
HTMLで作った時報アプリが動き...
-
javascriptでテーブルに追加し...
-
html javascript リンク先アド...
-
【西暦等の変換】
-
ローカルにあるファイルを検索...
-
ASP.NETのコントロールの値をJa...
-
なぜmatchメソッドがエラーにな...
-
翌月を取得するGASが分かりません
-
gas スプレッドシートがアクテ...
-
ASP.NET MVCでObjectをjsに渡す
-
カンマで終わってるのはセミコ...
-
JavaScriptで文字列の特定文字...
-
javascriptでiframeのURL変更は?
-
APIを使って埋め込んだグーグル...
おすすめ情報