我正在尝试制作一个包含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
变量的类型?
答案 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,
我们尝试使用的参数为0
和256
,它们以整数形式输入函数,默认整数类型为i32
。但是,这行
let random_number: u8 = rand::thread_rng().gen_range(0, 256);
将.gen_range()
的结果重新分配给u8
,编译器尝试将B1
和B2
都解析为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();