如何在基板中生成一个范围内的随机数?

How to generate a random number within a range in substrate?

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

 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));

我认为您需要为此使用 Randomness 链扩展。见 Randomness docs.

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

还有一些discussion and another code exaxmple here

编辑:我不确定这有多随机或合适,但您可以在您的 random_seed 片段之上构建。在你的例子中,你说你需要一个介于 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 个数组。

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