“NCD.L1.sample--lottery”合约的玩法如何?

Posted

技术标签:

【中文标题】“NCD.L1.sample--lottery”合约的玩法如何?【英文标题】:How play method works at "NCD.L1.sample--lottery" contract? 【发布时间】:2021-12-11 01:05:04 【问题描述】:

这是合同回购。 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 方法是如何工作的吗?

【问题讨论】:

【参考方案1】:

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

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 RNG

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

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 的变量相乘,我们在 Lotteryclass 中将其定义为 0.2

然后,我们将&lt;f64&gt; 放在此计算的开头,因为由于0.2,结果总是会是一个浮点数。

然后,我们将&lt;32&gt; 放在所有开头,以将该浮点数转换为无符号整数,因为我们需要将其与roll 进行比较,后者是一个无符号整数。您不能将浮点数与无符号整数进行比较。

最后,如果roll小于或等于&lt;u32&gt;(&lt;f64&gt;u32.MAX_VALUE * this.chance)this,则玩家获胜。

【讨论】:

以上是关于“NCD.L1.sample--lottery”合约的玩法如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何把TXT内的每9行合并成一行

Unity中的静态合批动态合批GPU Instance 以及SRP Batching

python 杂合极化 - 极化基于先前在VCF文件中识别杂合调用的可能性的杂合调用。 Usefu

鸿合电子白板应该如何使用?

excel多列合并成一列: 如1 2 3 合并成123在一列里面用逗号隔开

SQL怎么把多条数据合并成一条数据?