alf.nu random4 excercise,答案是什么?

时间:2017-03-13 15:09:51

标签: javascript

我正在玩这个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()); } } 变量,我想明确说明这一点。

4 个答案:

答案 0 :(得分:4)

Math.random() 可以可预测,可以被利用。理论上。 ES6 spec

  

使用依赖于实现的算法或策略,返回具有正号,大于或等于0但小于1的Number值,随机或伪随机选择,在该范围内具有近似均匀的分布。这个函数不带参数。

(强调我的。)

在实践中,大多数现代浏览器使用xorshift128+ChromeFirefoxSafari)。它的实现相当简短,可以相对容易地理解。请参阅此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

这里没有帮助