我试图为报价机器制作一个加权随机数生成器,如果某个项目被选中,则从另一组中选择一个,而不必进入并改变所有数字。
基本上,有一个主要的引号数组,其中包含数字。这些数字对应于列表,根据列表中的项目数量,它们更有可能被挑选。 (例如,如果选择 1 ,并且对应于其中包含10个项目的数组,那么它应该被挑选为字符串的十倍,因为它对应于十个字符串。)
所以,我决定将索引从一个简单的无偏随机数发生器转换成一个基本上是由随机数发生器运行的抽奖券机器,其中主阵列中的每个项目都放一张"票&#34 ; (或者它们的每个字符串的索引号。例如,如果我们使用前面的字符串和其他两个字符串,它应该是这样的:
input=["I am a string!",1,"Me Too!"];
output=[0,1,1,1,1,1,1,1,1,1,1,2];
然后从输出数组中随机选择一个数字,然后该数字对应于主数组中的项目。如果选择 1 ,则从 1 对应的数组中选择一个字符串。
但我计划在其中加入很多物品。我已经有四十多了,并计划添加更多,所以我做了一些东西,为我制作输出数组。 唯一的问题是,它不能正常工作。它应输出[0,1,2,3,3,3,4,6,6,6,6,7],而不是输出[3,3,3,7,7,7,7]。
//main array
var main=["one","two","three",1,"fourth",2,"fifth",3]
//array corresponding to 1
var first=["a","b","c"];
//array corresponding to 2. 2 will not be par of this array
var second=["1","2","3"];
//array corresponding to 3
var third=["red","yellow","green","blue"];
//weights
var weights=[];
//weight pusher
for (var i = 0; i < main.length; i++) {
//weight adder
if (!Number.isNaN(main[i])) {
switch (main[i]) { //If it gets to this point, main[i] should be 1, 2, or 3.
case 1:
//add i to the array once for every item in first (three times)
for (var j = 0; j < first.length; j++) {
weights.push(i)
}
break;
case 2:
//do nothing
break;
case 3:
//add i to the array once for every item in third (four times)
for (var j = 0; j < third.length; j++) {
weights.push(i)
}
break;
}
}else {
//If it's a regular string, add one i to the array.
weights.push(i);
};
};
console.log(weights); //Should output [0,1,2,3,3,3,4,6,6,6,6,7],instead outputs [3,3,3,7,7,7,7]
&#13;
答案 0 :(得分:0)
这不是你想要的:
if (!Number.isNaN(main[i])) {
Number.isNaN("one")
返回false
。
将其更改为:
if(typeof main[i] == "number") {
或者,如果您想允许将数字作为字符串输入,您可以使用:
if(!Number.isNaN(parseInt(main[i]))) {
答案 1 :(得分:0)
更换
if (!Number.isNaN(main[i])) {
使用
if ( ! isNaN(main[i] ) ) {
我明白了:
[ 0, 1, 2, 3, 3, 3, 4, 6, 7, 7, 7, 7 ]
答案 2 :(得分:0)
我认为你过于复杂,如果我理解正确,那么我认为这可能会以更清洁的方式解决你的问题:
const quotes = [
'one',
'two',
'three',
['a', 'b', 'c'],
['1', '2', '3'],
['red', 'yellow', 'green', 'blue']
];
function pickQuote(quotes) {
const index = Math.floor(Math.random() * quotes.length);
if (Array.isArray(quotes[index])) {
return pickQuote(quotes[index]);
}
return quotes[index];
}
for (let itr = 0; itr < 20; ++itr) {
console.log(pickQuote(quotes));
}
答案 3 :(得分:0)
这是你想要的结果,你只需检查你的条件 在每个条件之后更好地使用console.log来检查它是否正常工作
bichannels = "*"