如何在基板中生成一个范围内的随机数?
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
片段之上构建。在你的例子中,你说你需要一个介于 0
和 10
之间的随机数,所以你可以这样做:
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
个数组。
另请注意,如果存在重复项,此代码仅采用第一个最大索引。
我想生成一定范围内的随机数。如何在底物中做到这一点?
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
片段之上构建。在你的例子中,你说你需要一个介于 0
和 10
之间的随机数,所以你可以这样做:
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
个数组。
另请注意,如果存在重复项,此代码仅采用第一个最大索引。