Rust为自定义结构体实现Rng、RngCore出现冲突报错如何解决?
问题解决方案
错误原因
- 首先rand库存在默认的blanket实现:所有实现了
RngCore的类型都会自动获得Rngtrait的实现,你手动为Fp751Element实现Rng会和该默认实现直接冲突,这是报错的直接原因。 - 其次你当前的
RngCore实现存在无限递归问题:next_u64方法内部直接调用self.next_u64(),运行后会直接栈溢出。 - 核心需求理解偏差:你的最终目标是生成随机的
Fp751Element实例以适配quickcheck::Arbitrary,完全不需要让Fp751Element本身实现Rng/RngCore,你搞反了「随机数生成器」和「被生成的随机类型」的关系。 - 额外的语法错误:你在
Rng实现中写的fn gen<Fp751Element>(&mut self) -> Fp751Element里,尖括号内的Fp751Element是泛型参数名,和你定义的结构体重名,完全达不到返回自定义结构体的效果。
正确实现
方案1:直接实现Arbitrary(最适配你的需求)
不需要碰rand的Rng相关trait,直接为Fp751Element实现Arbitrary即可:
#[cfg(test)] use quickcheck::{Arbitrary, Gen}; #[cfg(test)] impl Arbitrary for Fp751Element { fn arbitrary(g: &mut Gen) -> Self { let mut limbs = [0u64; FP751_NUM_WORDS]; // 前11个 limb 直接生成随机u64 for i in 0..11 { limbs[i] = u64::arbitrary(g); } // 高位 limb 做范围限制 limbs[11] = u64::arbitrary(g) % 246065832128056; Fp751Element(limbs) } }
方案2:实现rand的Distribution trait(适配通用rand生成场景)
如果你需要通过rng.gen::<Fp751Element>()的方式生成实例,实现Distribution trait即可:
#[cfg(test)] use rand::{Rng, distributions::{Distribution, Standard}}; #[cfg(test)] impl Distribution<Fp751Element> for Standard { fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Fp751Element { let high_limb = rng.gen::<u64>() % 246065832128056; Fp751Element([ rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), rng.gen(), high_limb ]) } }
实现后你可以直接用任意Rng实例生成Fp751Element:
let mut rng = rand::thread_rng(); let elem: Fp751Element = rng.gen();
内容的提问来源于stack exchange,提问作者terett
相关产品推荐
相关产品推荐

