如何生成随机 num::BigUint?

How do I generate a random num::BigUint?

我需要一个随机的 256 位无符号数。我发现方法 gen_biguint()RandBigInt 特征,但我很难找到它的实现。

我前段时间为 BigInt 尝试过这样做。从那以后,板条箱已经更新。这就是我现在使用它来获得 BigUint 的方式。

extern crate num;
extern crate rand;

use num::bigint::{BigInt, BigUint, RandBigInt};

fn main() {
    let mut rng = rand::thread_rng();
    let mut n: BigUint = BigUint::default();
    loop {
        let bigUint: Option<BigUint> = rng.gen_bigint(256).to_biguint();
        match bigUint {
            Some(num) => {
                n = num.clone();
                println!("Found the 1st BigUint - {}", num);
                break;
            }
            _ => {}
        }
    }
}

来自我的 Cargo.toml

的内容
num = "0.1.42"
rand = "0.4.2"

我相信一定有一些直接的方法可以实现这一点。

来自 num 的自述文件:

The rand feature enables randomization traits in num-bigint and num-complex.

[dependencies]
num-bigint = { version = "0.2.0", features = ["rand"] }
rand = "0.5.4"

那么你需要使用一个RandomBits which implements rand::Distribution:

extern crate num_bigint;
extern crate rand;

use num_bigint::{BigInt, BigUint, RandomBits};
use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();

    let signed: BigInt = rng.sample(RandomBits::new(256));
    let unsigned: BigUint = rng.sample(RandomBits::new(256));

    println!("{}, {}", signed, unsigned)
}

Shepmaster 的回答是在较新版本的 rand 中引发了特征限制错误。让这个工作:

Cargo.toml

edition = "2018"

[dependencies]
rand = "0.6"
num-bigint = { version = "0.2.2", features = ["rand"] }

main.rs

use num_bigint::{BigUint, RandBigInt};

fn main() {
    let mut rng = rand::thread_rng();
    let unsigned: BigUint = rng.gen_biguint(256);
    println!("{}", unsigned);  
}