如何在合约中使用随机数

BLACK 5月前 266

我在合约中写了这样一段代码。
uint height = Blockchain.GetHeight();

Random r = new Random((int)height);

r.Next(1,100);


结果在虚拟机中运行会出错。去掉r.Next(1,100)就正常了。有什么其他方式使用随机数吗?

最后于 4月前 被naoye编辑 ,原因: 奖励 BLACK 20NNC 地址:AYGwy2s72CiKktbjEPnsZevvpMJbTNswLM
最新回复 (5)
全部楼主
  • BLACK 5月前
    0 2

    我突然,想到一个临时的方法。就是通过  Header.ConsensusData 计算得到自己想要的随机数。因为 Header.ConsensusData 数就是一个随机数。

    如果有更好的方式。请留言。。

  • 0 3
    Header.ConsensusData 作为一个随机因子  然后可以再加一点随机条件。
  • BLACK 5月前
    0 4
    咦~這裏有只豬 Header.ConsensusData 作为一个随机因子 然后可以再加一点随机条件。
    NEO的编译器好像不支持 C#中的Random,您有示例吗?
  • 0 5
    是不支持,可以直接用ConsensusData 作为随机数,也可以加入txid再随机一次,或者记录上一个块的ConsensusData两个随机数随机一波,玩法很多。


  • 0 6
     var consensusData = Blockchain.GetHeader(Blockchain.GetHeight()).ConsensusData;
                var txid = (ExecutionEngine.ScriptContainer as Transaction).Hash;
                BigInteger random = Neo.SmartContract.Framework.Helper.AsBigInteger(txid);
                ulong rd1 = (ulong)random % consensusData;
                ulong rd2 = rd1 % 100;
                return rd2;
返回