Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中优雅地计算连续范围?_Javascript - Fatal编程技术网

如何在javascript中优雅地计算连续范围?

如何在javascript中优雅地计算连续范围?,javascript,Javascript,我生成一个介于0和1之间的随机数。我可能使用了错误的术语,但我需要一种优雅的方法来评估范围 还有比下面更好的吗 if (RandNum < 0.075) { sVal = 'a'; } else if (RandNum < 0.123) { sVal = 'b'; } else if (RandNum < 0.199) { sVal = 'c'; } ... etc if(RandNum

我生成一个介于0和1之间的随机数。我可能使用了错误的术语,但我需要一种优雅的方法来评估范围

还有比下面更好的吗

if (RandNum < 0.075) { sVal = 'a'; }
else if (RandNum < 0.123) { sVal = 'b'; }
else if (RandNum < 0.199) { sVal = 'c'; }
... etc
if(RandNum<0.075){sVal='a';}
else如果(RandNum<0.123){sVal='b';}
else如果(RandNum<0.199){sVal='c';}
... 等

我唯一能想到的是:

switch(true) {
    case (RandNum < 0.075):
        sVal = 'a';
        break;
    case (RandNum < 0.123):
        sVal = 'b';
        break;
    ...
}
开关(真){
病例(随机数<0.075):
sVal='a';
打破
病例(随机数<0.123):
sVal='b';
打破
...
}
但它实际上只是改变了外观,javascript没有针对浮点操作的深入函数集

var RandNum = Math.random(),
    letter  = null,
    obj = {
        a : 0.075,
        b : 0.123,
        c : 0.199,
        d : 0.2,
        e : 0.4,
        f : 0.6,
        g : 0.8,
        h : 1
}

for (var k in obj) {
    if (RandNum < obj[k]) {
        letter = k;
        break;
    }
}
var RandNum=Math.random(),
字母=空,
obj={
a:0.075,
b:0.123,
c:0.199,
d:0.2,
e:0.4,
f:0.6,
g:0.8,
h:1
}
用于(obj中的var k){
if(RandNum

或者使用两个数组

var RandNum = Math.random(),
    letters  = 'abcdefgh'.split(''),
    range = [
        0.075,
        0.123,
        0.199,
        0.2,
        0.4,
        0.6,
        0.8,
        1
    ];

while (RandNum < range.pop());
var letter = letters[range.length];
var RandNum=Math.random(),
字母='abcdefgh'。拆分(''),
范围=[
0.075,
0.123,
0.199,
0.2,
0.4,
0.6,
0.8,
1.
];
而(RandNum

重复仍然存在,而且不容易扩展@阿德内奥的回答更为恰当。很可能,我并不认为自己有无限的智慧,然而,你的评论态度就更不恰当了:(很抱歉,我不是有意冒犯。我表达得不正确。对于这种情况,脚本的行为是相同的,adeneo的回答是适当的,但是,如果在每种情况下都需要不同的行为,那么解决方法就是使用
开关
语句。哇……圆滑干净。也许我应该把头伸进放弃编码。第二种变体更令人印象深刻,尽管我认为最纯粹的变体会争论两个数组不同步的风险。无论如何,非常感谢!事实上,第一种变体失败的风险更高,这就是我发布第二种变体的原因。第一种变体使用对象,并且依赖于浏览器按写入顺序对该对象执行操作。由于对象中没有保证的顺序,因此它不是真正的“安全”,但所有浏览器都会以正确的顺序进行迭代,所以这也不应该是一个问题,只是在没有顺序的东西中依赖顺序通常是我们想要避免的。@nas-在第二个例子中,有数组,数组确实有顺序,所以数组更适合这里。请注意,它更改了原始数组,所以它只能运行一次可靠,但如果需要,使用slice()的简单数组副本可以修复这一问题。