我希望在Javascript中编写一个不带参数的函数,但每次都会产生不同的(可预测的)输出。我将使用它进行测试,因此我需要确保我可以预测输出,这意味着使用Date.now()
将无效。我正在考虑使用种子RNG(或PRNG),但我想知道是否有其他替代解决方案。
编辑:该函数必须是自包含的,没有变量或函数范围之外的数据。
答案 0 :(得分:0)
只需在更广泛的范围内修改变量。
var my_counter = 0;
function count() {
return ++my_counter;
}
console.log(count());
console.log(count());
console.log(count());
console.log(count());
console.log(count());
console.log(count());
答案 1 :(得分:0)
我会选择随机播种的数字解决方案,映射到您希望返回的结果。这样你就可以把它保存在函数中。
OR有一个可以返回的结果数组,只是递增一个索引(带有一个模数,以便索引再次回到起始位置)并返回索引值的结果。有点像...
var index = 0;
var results = [ "x", "y", "z" ];
function test() {
var value = results[index];
index = (index++) % results.length;
return value;
}
因此,该函数将继续循环x,y和z结果。您可以根据需要设置多个可预测的结果。
答案 2 :(得分:0)
由于通过闭包任何函数都可以保持状态(比如你的计数器),你可以生成任意但固定的数据数组(比如,一个数字为Pi的字符串)并返回下一个值:
var getArbitraryValue = (function () {
var i = 0;
var arbitraryValue = Math.PI.toString();
return function () {
// you may want to reset the index here, once your string runs out
return arbitraryValue.charAt(i++);
}
} ());
重复调用getArbitraryValue将返回Pi的数字。
答案 3 :(得分:0)
对于ES2015生成器和迭代器,这是一个有趣的用例,如果你不介意涉及babel:
function* mygenerator() {
let i = 0;
while(true){
yield i++
}
}
const generator = mygenerator();
const noArgsDifferentResult = () => generator.next().value;
console.log(noArgsDifferentResult()); // 0
console.log(noArgsDifferentResult()); // 1
console.log(noArgsDifferentResult()); // 2
在Babel live parser https://babeljs.io/repl/
中试用