我遇到了为彩票建立随机数发生器的挑战 6个数字,在1到49之间,没有一个看起来是两次,按升序排列。一个第7个数字,超七,未分类,不能是以前的数字之一。
<script type="text/javascript">
const numb = new Array();
for (var i = 0; i < 6; i++) {
numb[i] = Math.floor(49 * Math.random()) + 1;
//compare to existing numbs
for (var k = 0; k < numb.length - 1; k++) {
if (numb[i] == numb[k]) {
i--;
break;
}
}
}
let supNumb = new Array();
supNumb = Math.floor(49 * Math.random()) + 1;
for (var s = 0; s <= 1; s++) {
// compare supNumb to numb
for (var t = 0; t < numb.length - 1; t++) {
if (supNumb == numb[t]) {
s--;
break;
}
}
}
// SORT & DISPLAY NUMBERS
function sort(a, b) {
return a - b;
}
numb.sort(sort);
document.write("<p> " + numb);
document.write("<h4>" + "SuperSeven: " + supNumb);
</script>
我知道通过尝试超级七supNumb
仍然提供与numb
相同的数字。
我无法让它工作,无法找到任何提到的地方。
此处有人可以查看并告诉我如何将supNumb
与numb
进行比较?
这甚至是正确的结构吗?
提前致谢!
答案 0 :(得分:0)
如果找到如此有效的数字,你可以制作一个无限循环并打破它:
while(true){
supNumb = Math.floor(49 * Math.random()) + 1;
if(numb.indexOf(supNumb) < 0){
break;
}
}
还可以更好地使用indexOf
,以便在数组中进行搜索。它比普通的JS快得多。
https://www.w3schools.com/jsref/jsref_indexof_array.asp
您甚至可以使用Set
机制来实现这一目标。集只能存储唯一值。因此将忽略所有重复项:
var numbers = new Set(),
supNumb = 0;
while(numbers.size < 6){
numbers.add(Math.floor(49 * Math.random()) + 1);
}
while(true){
supNumb = Math.floor(49 * Math.random()) + 1;
if(!numbers.has(supNumb)) break;
}
var sortedNumbers = [...numbers].sort((a,b)=>{return a-b})
console.log(sortedNumbers, supNumb);
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Set
答案 1 :(得分:0)
你有supNumb作为一个数组,我认为它应该是一个标量(单个整数),因为你正在对数组numb的数组成员进行比较
如果supNumb无法通过他的标准'它必须是唯一',你必须通过随机重新生成
答案 2 :(得分:0)
为了对非重复数字进行采样,有一种名为Fisher-Yates-Knuth shuffle的方法。保证从1 ... 49范围内选择7个非重复数字,无需任何二次检查。
在某些伪代码中(抱歉,不知道Javascript)
a = _.range(1, 50);
for i from n−1 downto 1 do
j ← random integer such that 0 ≤ j ≤ i
exchange a[j] and a[i]
sort(a, 6); // sort first 6 elements
super = a[6];