从0到255生成随机u8

时间:2017-12-09 00:24:40

标签: random rust

我正在尝试制作一个包含0到255的随机数的程序。看起来很简单!我这样做了:

extern crate rand;
use rand::Rng;

fn main() {
    println!("Guess the number!");
    let random_number: u8 = rand::thread_rng().gen_range(0, 255);

    println!("Your random number is {}", random_number);
}

这很好用,但这种方法的问题是the number 255 will not be included

  

gen_range方法将两个数字作为参数,并在它们之间生成一个随机数。它包含在下限,但在上限是独占的。

当我尝试这样做时:

let random_number: u8 = rand::thread_rng().gen_range(0, 256);

Rust会生成警告,因为u8只接受0到255之间的值。

warning: literal out of range for u8
 --> src/main.rs:6:61
  |
6 |     let random_number: u8 = rand::thread_rng().gen_range(0, 256);
  |                                                             ^^^
  |
  = note: #[warn(overflowing_literals)] on by default

如何解决此问题而无需更改random_number变量的类型?

2 个答案:

答案 0 :(得分:7)

请改用gen方法。此方法将从指定类型的整个可能值集生成随机值。

extern crate rand;

use rand::Rng;

fn main() {
    println!("Guess the number!");
    let random_number: u8 = rand::thread_rng().gen();

    println!("Your random number is {}", random_number);
}

答案 1 :(得分:0)

我偶然发现了同一问题,想知道为什么我不能为.gen_range(0, 256);使用u8

.gen_range()函数签名看起来像这样(docs

fn gen_range<T: SampleUniform, B1, B2>(&mut self, low: B1, high: B2) -> T where
    B1: SampleBorrow<T> + Sized,
    B2: SampleBorrow<T> + Sized, 

我们尝试使用的参数为0256,它们以整数形式输入函数,默认整数类型为i32。但是,这行

let random_number: u8 = rand::thread_rng().gen_range(0, 256);

.gen_range()的结果重新分配给u8,编译器尝试将B1B2都解析为u8,使函数中的泛型呼叫评估像这样

gen_range<u8>(B1, B2) -> u8 where 
    B1: SampleBorrow<u8> + Sized,
    B2: SampleBorrow<u8> + Sized, 

256将不适合u8,导致编译器抛出overflowing_literals警告。

通过让显式类型声明定义泛型约束,指出here指出了计算具有最大原语范围的随机数的正确方法。

例如:

use rand::Rng;
let random_with_range: u8 = rand::thread_rng().gen();