我正在玩这个site,我遇到了 random4 问题。
所以,基本上,问题如下。
var random4 = new function() {
var rand = Math.random();
this.test = function(x) {
return rand === x;
}
};
x
应该将random4.test
的哪个值传递给true
才能让它返回rand
?
请注意,此处的代码与链接页面略有不同。这是因为我们不可以访问public static void readFile(){
try {
// byte[] bytesInput = FileUtils.readFileToByteArray(new File("C:/Users/mavensi/Desktop/catalina_14.log"));
byte[] bytesInput = IoUtils.readBytes(new File("C:/Users/mavensi/Desktop/catalina_14.log"));
System.err.println(bytesInput.length);
}catch(IOException e){
System.out.println(e.getMessage());
}
}
变量,我想明确说明这一点。
答案 0 :(得分:4)
Math.random()
可以可预测,可以被利用。理论上。 ES6 spec说
使用依赖于实现的算法或策略,返回具有正号,大于或等于0但小于1的Number值,随机或伪随机选择,在该范围内具有近似均匀的分布。这个函数不带参数。
(强调我的。)
在实践中,大多数现代浏览器使用xorshift128+(Chrome,Firefox,Safari)。它的实现相当简短,可以相对容易地理解。请参阅此related question。
我们可以攻击此实现并预测序列中的值,还是尝试找出以前的值?根据{{3}},我们Security.SX。我们can可以。这绝对不容易,但可能。
我不知道这是否真的可以用于解决链接练习。从理论上讲,它可以。
替代方案可能是传递与其相比总是等于任何数字的东西。也就是说,重载严格相等really运算符。不幸的是,据我所知,JavaScript不支持运算符重载。您可以===
使用后期处理(不能在链接页面上使用),或者在某些情况下使用cheat,但是这个挑战不是其中之一,因为我们有使用严格相等进行比较的原语运算符 - 不进行转换或valueOf
。
答案 1 :(得分:0)
您只需传递您已声明的rand
变量:
random4(rand);
rand
等于x
,等于rand
。
var rand = Math.random();
function random4(x) {
return rand === x;
}
console.log(random4(rand));
答案 2 :(得分:0)
这个问题是出于学习目的而诱骗你理解这个概念。
在这种情况下,唯一等于8x1x2
的数字是rand
,因此如果您将rand
传递给函数而不是rand
,则获取与{x
相同的值1}}。
要测试它,只需在console.log中调用该函数,它将返回rand
。
true
答案 3 :(得分:0)
还在尝试这个,但它可能类似于
random4(
Math.random = function(){return true}
)
虽然这需要函数本身等于它的返回值,这就是我不确定的部分
https://stackoverflow.com/a/6959642/1281385
这里没有帮助