【问题标题】:alf.nu random4 excercise, what is the answer?alf.nu 随机 4 题,答案是什么?
【发布时间】:2017-03-13 15:09:51
【问题描述】:

我在玩这个site,却被random4问题卡住了。

所以,基本上,问题如下。

var random4 = new function() {
  var rand = Math.random();

  this.test = function(x) {
    return rand === x;
  }
};

应该将x 的什么值传递给random4.test 以使其返回true

请注意,此处的代码与链接页面略有不同。这是因为我们确实没有可以访问rand 变量,我想明确说明这一点。

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

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

    (强调我的。)

    实际上,大多数现代浏览器使用xorshift128+ChromeFirefoxSafari)。它的实现相当简短,可以相对容易地理解。看到这个related question

    我们可以攻击这个实现并预测序列中的值,或者尝试找出以前的值吗?根据Security.SX,我们can。我们really可以。这绝对不容易,但有可能。

    我不知道这是否真的可以用来解决链接练习。理论上是可以的。


    另一种方法是传入与它相比总是等于任何数字的东西。也就是说,重载严格相等=== 运算符。不幸的是,据我所知,JavaScript 不支持运算符重载。您可以cheat 并使用后处理(不能在链接页面上使用),或者在某些情况下使用fake it,但这个挑战不是其中之一,因为我们有使用严格相等运算符比较的原语 - 那个不进行强制转换或valueOf

    【讨论】:

    • 这里有很多有价值的信息,但这仍然不能解决实际问题:(
    【解决方案2】:

    您只需传递您已经在其中声明的rand 变量:

    random4(rand);
    

    rand 等于 x 等于 rand

    var rand = Math.random();
    function random4(x) {
        return rand === x;
    }
    
    console.log(random4(rand));

    【讨论】:

    • 问题是 rand 是在另一个上下文中定义的,因此无法访问,你可以在那里尝试,你会得到“rand is undefined”
    【解决方案3】:

    仍在尝试,但可能类似于

    random4(
        Math.random = function(){return true}
    )
    

    虽然这需要函数本身等于它的返回值,但这是我不确定的部分

    https://stackoverflow.com/a/6959642/1281385

    这里没有帮助

    【讨论】:

    • rand 在调用 random4 之前设置为 Math.random(),因此无论您如何定义 Math.random,它都不会产生影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2019-05-10
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多