【问题标题】:How to generate a random number within a range in substrate?如何在基板范围内生成随机数?
【发布时间】:2021-11-25 08:07:02
【问题描述】:

我想生成一定范围内的随机数。如何在基板中做到这一点?

 fn draw_juror_for_citizen_profile_function(
        citizen_id: u128,
        length: usize,
    ) -> DispatchResult {

        let nonce = Self::get_and_increment_nonce();

        let random_seed = T::RandomnessSource::random(&nonce).encode();
        let random_number = u64::decode(&mut random_seed.as_ref())
        .expect("secure hashes should always be bigger than u32; qed");
        
        Ok(())
    }

我不能使用 rand 包,因为它不支持 no_std。

rng.gen_range(0..10));

【问题讨论】:

    标签: substrate


    【解决方案1】:

    我认为您需要为此使用Randomness 链扩展。请参阅Randomness docs

    此示例显示how to call Randomness from a contract

    有一些discussion and another code exaxmple here

    编辑:我不确定这是多么随机或合适,但您可以在 random_seed sn-p 之上构建。在您的示例中,您说您需要一个介于 010 之间的随机数,因此您可以这样做:

            fn max_index(array: &[u8]) -> usize {
                let mut i = 0;
    
                for (j, &value) in array.iter().enumerate() {
                    if value > array[i] {
                        i = j;
                    }
                }
    
                i
            }
    
            // generate your random seed
            let arr1 = [0; 2];
            let seed = self.env().random(&arr1).0;
    
            // find the maximum index for the slice [0..10]
            let rand_index = max_index(&seed.as_ref()[0..10]);
    

    返回的数字将在0-10 范围内。但是,这显然受到您以[u8; 32] 开头的事实的限制。对于更大的范围,也许您只需连接 u8 数组。

    另请注意,如果有重复,此代码仅采用第一个最大索引。

    【讨论】:

    • 是的,我知道如何从种子中生成随机数。 let random_number = u64::decode(&mut random_seed.as_ref()) 但我需要一个范围内的随机数。
    • 我在我的答案中添加了一个基于您的代码 sn-p 的编辑。
    • 仅供参考 - helper functions to generate random numbers from random seed 有一个未解决的问题。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多