2

这是合同回购。https://github.com/Learn-NEAR/NCD.L1.sample--lottery

看不懂这里的玩法 https://github.com/Learn-NEAR/NCD.L1.sample--lottery/blob/2bd11bc1092004409e32b75736f78adee821f35b/src/lottery/assembly/lottery.ts#L11-L16

 play(): bool {
    const rng = new RNG<u32>(1, u32.MAX_VALUE);
    const roll = rng.next();
    logging.log("roll: " + roll.toString());
    return roll <= <u32>(<f64>u32.MAX_VALUE * this.chance);
  }

我不明白获胜的过程,但我确信它隐藏在这个方法中。那么有人可以详细解释这种play方法是如何工作的吗?

4

1 回答 1

2

要了解中奖过程,我们应该看一下合同play中文件中的方法。lottery.ts

https://github.com/Learn-NEAR/NCD.L1.sample--lottery/blob/2bd11bc1092004409e32b75736f78adee821f35b/src/lottery/assembly/lottery.ts#L11-L16

    play(): bool {
        const rng = new RNG<u32>(1, u32.MAX_VALUE);
        const roll = rng.next();
        logging.log("roll: " + roll.toString());
        return roll <= <u32>(<f64>u32.MAX_VALUE * this.chance);
      }

在阅读此代码之前,我们应该了解几件事。

  • 布尔
  • u32
  • f64
  • 随机数<32>

bool意味着我们的play方法应该只返回 true 或 false。

u32是一个 32 位无符号整数。它是一个使用 32 位存储的正整数。

u8的最大值为255。u16的最大值为65535。u32的最大值为4294967295。u64的最大值为18446744073709551615。所以,这些无符号整数不能是负值。

f64是一个有小数位的数字。这种类型可以表示广泛的十进制数,如 3.5、27、-113.75、0.0078125、34359738368、0、-1。因此,与整数类型(例如 i32)不同,浮点类型也可以表示非整数。

RNG代表Random Number Generator. 它基本上给你一个范围内的随机数u32。它需要两个参数来定义方法的范围。在这种情况下,范围在1u32.MAX_VALUE之间。换句话说,它是14294967296。下一行创建一个名为的变量roll并将其分配给 的值rng.next()

那么,有什么作用next()呢?把它想象rng成一台只有一个红色大按钮的大机器。当你按下那个红色的大按钮时,它会给你一个这台机器能够产生的数字。意思是,每次你点击那个按钮时,它都会给你一个介于1u32.MAX_VALUE之间的数字

第三行只是将登录roll到控制台。您应该在控制台中看到类似的内容roll: 3845432649

最后一行一开始看起来很混乱,但让我们逐个看一下。

在这里,u32.MAX_VALUE * this.chance我们将这个最大值与我们在chance中定义为0.2的变量相乘。Lottery

然后,我们把这个计算放在开头,因为由于0.2<f64>,结果总是会是一个浮点数。

然后,我们把<32>这个浮点数转换为无符号整数放在开头,因为我们需要将它与roll符号整数进行比较。您不能将浮点数与无符号整数进行比较。

最后,如果roll小于或等于<u32>(<f64>u32.MAX_VALUE * this.chance)这个,玩家获胜。

于 2021-10-25T14:40:21.263 回答