const A = [0,7,8,15,16,23,24,31]
const B = [1,2,3,4,5,6,25,26,27,28,29,30,9,17,22 ]
const C = [10,11,12,13,18,19,20,21, 14]
function shuffleBoard(length) {
const result = []
for(let i = 0; i < length; i += 1) {
while (true) {
let bucket = null
let rand = Math.random()
if (rand < 0.5) {
bucket = A
} else if (rand < 0.95) {
bucket = B
} else {
bucket = C
}
const pick = bucket[Math.floor(Math.random() * bucket.length)]
if (!result.slice(-6).includes(pick)) {
result.push(pick)
break
}
}
}
return result
}
function validate(result) {
const ratios = {
'A': result.filter(xs => A.includes(xs)).length / result.length,
'B': result.filter(xs => B.includes(xs)).length / result.length,
'C': result.filter(xs => C.includes(xs)).length / result.length,
}
return ratios
}
const result = shuffleBoard(5000)
console.log(JSON.stringify(validate(result)))
Y29uc3QgQSA9IFswLDcsOCwxNSwxNiwyMywyNCwzMV0KY29uc3QgQiA9IFsxLDIsMyw0LDUsNiwyNSwyNiwyNywyOCwyOSwzMCw5LDE3LDIyIF0KY29uc3QgQyA9IFsxMCwxMSwxMiwxMywxOCwxOSwyMCwyMSwgMTRdCgpmdW5jdGlvbiBzaHVmZmxlQm9hcmQobGVuZ3RoKSB7CiAgY29uc3QgcmVzdWx0ID0gW10KCiAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBsZXQgYnVja2V0ID0gbnVsbAogICAgICBsZXQgcmFuZCA9IE1hdGgucmFuZG9tKCkKICAgICAgaWYgKHJhbmQgPCAwLjUpIHsKICAgICAgICBidWNrZXQgPSBBCiAgICAgIH0gZWxzZSBpZiAocmFuZCA8IDAuOTUpIHsKICAgICAgICBidWNrZXQgPSBCCiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVja2V0ID0gQwogICAgICB9CgogICAgICBjb25zdCBwaWNrID0gYnVja2V0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGJ1Y2tldC5sZW5ndGgpXQoKICAgICAgaWYgKCFyZXN1bHQuc2xpY2UoLTYpLmluY2x1ZGVzKHBpY2spKSB7CiAgICAgICAgcmVzdWx0LnB1c2gocGljaykKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gcmVzdWx0Cn0KCmZ1bmN0aW9uIHZhbGlkYXRlKHJlc3VsdCkgewogIGNvbnN0IHJhdGlvcyA9IHsKICAgICdBJzogcmVzdWx0LmZpbHRlcih4cyA9PiBBLmluY2x1ZGVzKHhzKSkubGVuZ3RoIC8gcmVzdWx0Lmxlbmd0aCwKICAgICdCJzogcmVzdWx0LmZpbHRlcih4cyA9PiBCLmluY2x1ZGVzKHhzKSkubGVuZ3RoIC8gcmVzdWx0Lmxlbmd0aCwKICAgICdDJzogcmVzdWx0LmZpbHRlcih4cyA9PiBDLmluY2x1ZGVzKHhzKSkubGVuZ3RoIC8gcmVzdWx0Lmxlbmd0aCwKICB9CgogIHJldHVybiByYXRpb3MKfQoKY29uc3QgcmVzdWx0ID0gc2h1ZmZsZUJvYXJkKDUwMDApCmNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHZhbGlkYXRlKHJlc3VsdCkpKQoK