himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

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)); }