bit 演算版 lotos()
※ 1からloto の最大値(MiniLoto は 31、Loto6 は 43)までの数列を連続した bit field と見做し、loto の数字の組み合わせ(MiniLoto は 5個、Loto6 は 6個)を乱数で生成し、生成した値に対応した bit をマークする。Loto の数字の組み合わせは重複が許されないので、乱数で生成した値が、前回までの値と重複したかどうか、bit field を検査して確認する。
※ javascript であまり大きな bit shift はできない(オペランドは 32bit 整数として処理されるはず)ので loto の最大値(=bit field の大きさ)によっては l.fld を分割する必要がある
※ JavaSE 6 jrunscript で検証
function lotos(ltMd){ var l={ "ceil":0, "fld":[0,0], "bit":0, "L":[], "col":0 }; function getLtBit(){ return(Math.ceil(Math.random()*l.ceil)); } function chkLt(ltix) { return l.fld[Math.floor(ltix/32)] & 1<<(ltix%32); } function setLt(ltix) { l.fld[Math.floor(ltix/32)] |= 1<<(ltix%32); s= "00"+ ltix; l.L[l.col]=s.substr(s.length-2,2) } for(i=c=0; i<ltMd; c+= ++i); l.ceil=c*2+1; l.col=0; setLt(getLtBit()); for(l.col=1,setLt(l.bit);l.col<ltMd;l.col++){ do{l.bit=getLtBit();} while(0!=(chkLt(l.bit))); setLt(l.bit); } return(l.L.sort().toString()); } sx=read("5:minilot\n6:loto6\n"); if(sx<5 || sx>6){ print("bad arguments\n"); } else{ print(lotos(sx)); }