【乱数】任意の範囲、固定個数、重複しない乱数
テニスのダブルス組み合わせ用のスクリプトを考えております。
ネットでいろいろ探して試してみましたが
Javascript初心者で、寄せ集めでは限界がありますので質問させてください(;^_^A
【何をしたいのか】
・テキストボックスで任意の数字(整数)で範囲と行数を指定。
・結果は数値4個固定とし、4個で1グループ。この4個内は重複がないように。
・4個1グループを指定の行数分求める。
・このとき、なるべくならすでに出た数字は後回しにしたい。例えば1~10の範囲としたら、1~10すべて出るまでは一度出た数字は後回しになるように。
・小さい範囲で大きな行数を指定すれば、必ず同じ組み合わせが出ることは了承。
・結果は下記のようにしたい。
1,6,8,3
2,4,5,10
9,7,2,3
・
・
3,6,8,1(1行目と同じ組み合わせだが順不同なので可、またはまったく同じのが出ても可)
【現在の状況】
ネットで拾ったサンプルから、何をどのように書き換えたらいいのかわからずです(;^_^A
【サンプルの提示】
■範囲の乱数■
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--
function gen_random(num1, num2) {
retval=Math.random();
document.write(Math.floor(retval * (num2 - num1)) + eval(num1));
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<center>
<table border=1 cellpadding=4>
<form name=myform>
<tr><td bgcolor=#ffffe4 align=center>
<font color=blue>
乱数の範囲
</td></tr>
<tr><td align=center>
<input type=text name=d1 size=2 maxlength=2> ~
<input type=text name=d2 size=4 maxlength=4>
</td></tr>
<tr><td align=center>
<input type=button name=btn1 value=乱数発生 onClick=gen_random(myform.d1.value,myform.d2.value)><br>
</td></tr>
</form>
</table>
</center>
</BODY>
</HTML>
----------------------------------------
■30個を5行ずつ出している
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
var i;
for(i=1 ; i <=30 ;i++)
{
document.write(Math.floor(Math.random()*10) +"<BR>");
if(i%5 == 0)
document.write("<HR>");
}
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
---------------------------------------------------------
■重複しない、しかも後回しになる?■
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
//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);
</SCRIPT>
</HEAD>