随机数生成
生成随机数是许多不同项目中常见的任务。你可能已经在FunC文档中看到过random()
函数,但请注意,除非你采用一些额外的技巧,否则其结果很容易被预测。
如何预测随机数?
计算机在生成随机信息方面非常糟糕,因为它们只是遵循用户的指令。然而,由于人们经常需要随机数,他们设计了各种方法来生成_伪随机_数。
这些算法通常要求你提供一个_seed_值,该值将被用来生成一系列_伪随机_数。因此,如果你多次运行相同的程序并使用相同的_seed_,你将始终得到相同的结果。在TON中,每个区块的_seed_是不同的。
因此,要预测智能合约中random()
函数的结果,你只需要知道当前区块的seed
,如果你不是验证者,这是不可能的。
只需使用randomize_lt()
为了使随机数生成不可预测,你可以将当前的逻辑时间添加到seed中,这样不同的交易将具有不同的seed和结果。
只需在生成随机数之前调用randomize_lt()
,你的随机数就会变得不可预测:
randomize_lt();
int x = random(); ;; users can't predict this number
然而,你应该注意验证者或协作者仍然可能影响随机数的结果,因为他们决定了当前区块的seed。