題のとおり、javascriptで重複しないように値を取得したいと思っております。
以下ソースの一部です。
for (var v = 0; v < 5; v++) {
var i = 0;
var a = Math.floor(Math.random()*test.length);
while ( a == i ){
a = Math.floor(Math.random()*test.length);
}
if (a != i){
i = a;
}
}
このプログラムだと隣り合う回数の1回目と2回目などは重複しないんですが、1回目と3回目は重複してしまいます。
なにか重複しない方法はないでしょうか?初心者説明ですいませんが、ご教授おねがいします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
重複しない乱数を発生させるためには、
1.乱数候補(0,1,2,3など)を配列に格納
2.配列をシャッフル
3.配列から順番に取り出す
の様な手段をとる必要があります。
以下にサンプルコードを載せておきます。
最初にシャッフルするのではなく
乱数が取り出されるたびに少しずつシャッフルする感じにしてみました。
(this.arr[idx]=this.arr[this.cnt-1];の部分がシャッフルに相当。
本当のシャッフルなら値の交換が必要ですが、乱数生成のためだけなら必要ないです。)
----------------------------------------------------------------------
//once_rand: min以上max未満の重複しない乱数を生成するためのオブジェクト
function once_rand(min,max){
this.cnt=max-min;
this.arr=[];
//乱数候補を配列に格納
for(var i=0;i<this.cnt;i++){this.arr[i]=min++;}
}
//乱数を取り出すメソッド
once_rand.prototype.next=function(){
if(this.cnt<=0){
//もう乱数候補が残っていない
return undefined;
}
//乱数を取り出す位置を決定
var idx=Math.floor(Math.random()*(this.cnt));
//乱数を取り出す
var rand_val=this.arr[idx];
//重複しないように最後尾の要素で上書き(今のthis.arr[this.cnt-1]は次回以降使われない)
this.arr[idx]=this.arr[this.cnt-1];
//残りの乱数候補が減少
this.cnt--;
return rand_val;
}
//テスト
var rand1 = new once_rand(1,15); //1以上15未満
var str=rand1.next();
while(1){
var rand_val=rand1.next(); //乱数を取り出す
if(rand_val == undefined){break;}
str += ","+rand_val;
}
alert(str);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- Ruby vscode 文字化け 1 2022/05/21 19:17
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- 生物学 【 生基 DNAの複製 】 問題 窒素の同位体15N(窒素14Nより重い)のみを窒素源として含む培地 2 2022/10/08 16:33
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- 物理学 QEDラグランジアンについて 7 2022/09/03 13:17
- その他(クラウドサービス・オンラインストレージ) Googleスプレッドシートについて 1 2022/05/11 15:26
- Visual Basic(VBA) セルの値からファイルを複数作りたい2 3 2022/10/07 15:54
- 統計学 生物統計学の質問 7 2022/05/17 13:59
- JavaScript 画像の表示位置 3 2022/12/23 08:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
javascript 変数名の連結をしたい
-
JavaScriptにおける[] とか :...
-
javascriptで行を抽出したいです。
-
商品リンクをランダムで指定数...
-
React hooksが値を返して配列変...
-
【JavaScript】オブジェクト型...
-
undefinedを表示させない方法は...
-
javaScriptのコードの修正をお...
-
functionから別のfunctionを実...
-
文字を一文字ずつ表示
-
idを使わずにonclickで自身の要...
-
ActiveXobjectが作成できない
-
C#OpenCv V4にのエラーに関する...
-
翌月を取得するGASが分かりません
-
window.openでタイトル名の指定
-
<a>タグのテキストを取得
-
ASP+アクセスでのSQLコメントに...
-
google apps scriptの終了のさせ方
-
関数でy=g(x)のgとは何の略です...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
二次元配列を使って順位をだす...
-
C#テキストボックスの文字を配...
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
React hooksが値を返して配列変...
-
undefinedを表示させない方法は...
-
javascriptで行を抽出したいです。
-
二次元配列の全要素の全要素を...
-
JavaScriptにおける[] とか :...
-
JavaScriptでの動的な多次元配...
-
順列生成アルゴリズムについて...
-
WSH(Jscript)でファイル一覧
-
JavaScriptからPHPに配列を渡す...
-
javascriptからphpに配列データ...
-
多次元配列から最大値を1行また...
-
textareaに入力されたデータを...
-
どうすればresponseText結果を...
-
オブジェクトから任意のプロパ...
-
フォーム入力値の重複チェック
おすすめ情報