|
|
|
|
<!doctype html><html lang=zh-CN class="sidebar-visible no-js light"><meta charset=UTF-8><title>生成随机值 - Rusty Book(锈书)</title><meta content="text/html; charset=utf-8" http-equiv=Content-Type><meta name=description content=""><meta name=viewport content="width=device-width,initial-scale=1"><meta name=theme-color content=#ffffff><link rel=icon href=../favicon.svg><link rel="shortcut icon" href=../favicon.png><link rel=stylesheet href=../css/variables.css><link rel=stylesheet href=../css/general.css><link rel=stylesheet href=../css/chrome.css><link rel=stylesheet href=../css/print.css media=print><link rel=stylesheet href=../FontAwesome/css/font-awesome.css><link rel=stylesheet href=../fonts/fonts.css><link rel=stylesheet href=../highlight.css><link rel=stylesheet href=../tomorrow-night.css><link rel=stylesheet href=../ayu-highlight.css><link rel=stylesheet href=../theme/style1.css><body><script>var path_to_root="../",default_theme=window.matchMedia("(prefers-color-scheme: dark)").matches?"navy":"light"</script><script>try{var theme=localStorage.getItem("mdbook-theme"),sidebar=localStorage.getItem("mdbook-sidebar");theme.startsWith('"')&&theme.endsWith('"')&&localStorage.setItem("mdbook-theme",theme.slice(1,theme.length-1)),sidebar.startsWith('"')&&sidebar.endsWith('"')&&localStorage.setItem("mdbook-sidebar",sidebar.slice(1,sidebar.length-1))}catch(e){}</script><script>var theme;try{theme=localStorage.getItem("mdbook-theme")}catch(e){}null==theme&&(theme=default_theme);var html=document.querySelector("html");html.classList.remove("no-js"),html.classList.remove("light"),html.classList.add(theme),html.classList.add("js")</script><script>var html=document.querySelector("html"),sidebar="hidden";if(document.body.clientWidth>=1080){try{sidebar=localStorage.getItem("mdbook-sidebar")}catch(e){}sidebar=sidebar||"visible"}html.classList.remove("sidebar-visible"),html.classList.add("sidebar-"+sidebar)</script><nav id=sidebar class=sidebar aria-label="Table of contents"><div class=sidebar-scrollbox><ol class=chapter><li class="chapter-item expanded affix"><a href=../about.html>Rusty Book</a><li class="chapter-item expanded affix"><li class=part-title>Awesome<li class=spacer><li class="chapter-item expanded"><a href=../daily-dev.html>日常开发常用库</a><li class="chapter-item expanded"><a href=../superstar.html>Rust 明星项目</a><li class="chapter-item expanded"><a href=../empowering-js.html>使用 Rust 增强 JS</a><li class="chapter-item expanded"><a href=../games.html>Rust开发的游戏</a><li class="chapter-item expanded"><a href=../gamedev.html>游戏引擎</a><li class="chapter-item expanded affix"><li class=part-title>Awesome + Cookbook<li class=spacer><li class="chapter-item expanded"><a href=../algos/awesome.html>实用算法</a><a class=toggle><div>❱</div></a><li><ol class=section><li class="chapter-item expanded"><a href=../algos/randomness.html class=active>生成随机值</a><li class="chapter-item expanded"><a href=../algos/sorting.html>Vec 排序</a><li class="chapter-item expanded"><div>压缩算法</div><a class=toggle><div>❱</div></a><li><ol class=section><li class=chapter-item><a href=../algos/compression/tar.html>使用.tar包</a></ol><li class="chapter-item expanded"><div>密码学</div><a class=toggle><div>❱</div></a><li><ol class=section><li class=chapter-item><a href=../algos/cryptography/hashing.html>哈希</a><li class=chapter-item><a href=../algos/cryptography/encryption.html>加密</a></ol><li class="chapter-item expanded"><div>数学计算</div><a class=toggle><div>❱</div></a><li><ol class=section><li class=chapter-item><a href=../algos/math/linear-algebra.html>线性代数</a><li class=chapter-item><a href=../algos/math/trigonometry.html>三角函数</a><li class=chapter-item><a href=../algos/math/complex.html>复数</a><li class=chapter-item><a href=../algos/math/statistics.html>统计学</a><li class=chapter-item><a href=../algos/math/misc.html>杂项</a></ol></ol><li class="chapter-item expanded"><a href=../datastructures/awesome.html>数据结构</a><a class=toggle><div><EFBFBD>
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let mut rng = rand::thread_rng();
|
|
|
|
|
|
|
|
|
|
let n1: u8 = rng.gen();
|
|
|
|
|
let n2: u16 = rng.gen();
|
|
|
|
|
println!("Random u8: {}", n1);
|
|
|
|
|
println!("Random u16: {}", n2);
|
|
|
|
|
println!("Random u32: {}", rng.gen::<u32>());
|
|
|
|
|
println!("Random i32: {}", rng.gen::<i32>());
|
|
|
|
|
println!("Random float: {}", rng.gen::<f64>());
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><h3 id=指定范围生成随机数><a class=header href=#指定范围生成随机数>指定范围生成随机数</a></h3><p>使用 <a href=https://rust-lang-nursery.github.io/rust-cookbook/algorithms/randomness.html>Rng::gen_range</a> 生成 [0, 10) 区间内的随机数( 右开区间,不包括 <code>10</code> )。<pre><pre class=playground><code class="language-rust editable edition2021">use rand::Rng;
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let mut rng = rand::thread_rng();
|
|
|
|
|
println!("Integer: {}", rng.gen_range(0..10));
|
|
|
|
|
println!("Float: {}", rng.gen_range(0.0..10.0));
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><p><a href=https://docs.rs/rand/*/rand/distributions/uniform/struct.Uniform.html>Uniform</a> 可以用于生成<ruby>均匀分布<rt>uniform distribution</ruby>的随机数。当需要在同一个范围内重复生成随机数时,该方法虽然和之前的方法效果一样,但会更快一些。<pre><pre class=playground><code class="language-rust editable edition2021">use rand::distributions::{Distribution, Uniform};
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let mut rng = rand::thread_rng();
|
|
|
|
|
let die = Uniform::from(1..7);
|
|
|
|
|
|
|
|
|
|
loop {
|
|
|
|
|
let throw = die.sample(&mut rng);
|
|
|
|
|
println!("Roll the die: {}", throw);
|
|
|
|
|
if throw == 6 {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><h3 id=使用指定分布来生成随机数><a class=header href=#使用指定分布来生成随机数>使用指定分布来生成随机数</a></h3><p>默认情况下,<code>rand</code> 包使用均匀分布来生成随机数,而 <a href=https://docs.rs/rand_distr/*/rand_distr/index.html>rand_distr</a> 包提供了其它类型的分布方式。<p>首先,你需要获取想要使用的分布的实例,然后在 <a href=https://docs.rs/rand/*/rand/trait.Rng.html>rand::Rng</a> 的帮助下使用 <a href=https://docs.rs/rand/*/rand/distributions/trait.Distribution.html#tymethod.sample>Distribution::sample</a> 对该实例进行取样。<p>如果想要查询可用的分布列表,可以访问<a href=https://docs.rs/rand_distr/*/rand_distr/index.html>这里</a>,下面的示例中我们将使用 <a href=https://docs.rs/rand_distr/0.4.3/rand_distr/struct.Normal.html>Normal</a> 分布:<pre><pre class=playground><code class="language-rust editable edition2021">use rand_distr::{Distribution, Normal, NormalError};
|
|
|
|
|
use rand::thread_rng;
|
|
|
|
|
|
|
|
|
|
fn main() -> Result<(), NormalError> {
|
|
|
|
|
let mut rng = thread_rng();
|
|
|
|
|
let normal = Normal::new(2.0, 3.0)?;
|
|
|
|
|
let v = normal.sample(&mut rng);
|
|
|
|
|
println!("{} is from a N(2, 9) distribution", v);
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><h3 id=在自定义类型中生成随机值><a class=header href=#在自定义类型中生成随机值>在自定义类型中生成随机值</a></h3><p>使用 <a href=https://docs.rs/rand/*/rand/distributions/trait.Distribution.html>Distribution</a> 特征包裹我们的自定义类型,并为 <a href=https://docs.rs/rand/*/rand/distributions/struct.Standard.html>Standard</a> 实现该特征,可以为自定义类型的指定字段生成随机数。<pre><pre class=playground><code class="language-rust editable edition2021">use rand::Rng;
|
|
|
|
|
use rand::distributions::{Distribution, Standard};
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
struct Point {
|
|
|
|
|
x: i32,
|
|
|
|
|
y: i32,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Distribution<Point> for Standard {
|
|
|
|
|
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Point {
|
|
|
|
|
let (rand_x, rand_y) = rng.gen();
|
|
|
|
|
Point {
|
|
|
|
|
x: rand_x,
|
|
|
|
|
y: rand_y,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let mut rng = rand::thread_rng();
|
|
|
|
|
|
|
|
|
|
// 生成一个随机的 Point
|
|
|
|
|
let rand_point: Point = rng.gen();
|
|
|
|
|
println!("Random Point: {:?}", rand_point);
|
|
|
|
|
|
|
|
|
|
// 通过类型暗示( hint )生成一个随机的元组
|
|
|
|
|
let rand_tuple = rng.gen::<(i32, bool, f64)>();
|
|
|
|
|
println!("Random tuple: {:?}", rand_tuple);
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><h3 id=生成随机的字符串a-z-a-z-0-9><a class=header href=#生成随机的字符串a-z-a-z-0-9>生成随机的字符串(A-Z, a-z, 0-9)</a></h3><p>通过 <a href=https://docs.rs/rand/0.8.5/rand/distributions/struct.Alphanumeric.html>Alphanumeric</a> 采样来生成随机的 ASCII 字符串,包含从 <code>A-Z, a-z, 0-9</code> 的字符。<pre><pre class=playground><code class="language-rust editble edition2021">use rand::{thread_rng, Rng};
|
|
|
|
|
use rand::distributions::Alphanumeric;
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let rand_string: String = thread_rng()
|
|
|
|
|
.sample_iter(&Alphanumeric)
|
|
|
|
|
.take(30)
|
|
|
|
|
.map(char::from)
|
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
|
|
println!("{}", rand_string);
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><h3 id=生成随机的字符串-用户指定-ascii-字符-><a class=header href=#生成随机的字符串-用户指定-ascii-字符->生成随机的字符串( 用户指定 ASCII 字符 )</a></h3><p>通过 <a href=https://docs.rs/rand/0.8.5/rand/trait.Rng.html#method.gen_range>gen_string</a> 生成随机的 ASCII 字符串,包含用户指定的字符。<pre><pre class=playground><code class="language-rust editable edition2021">fn main() {
|
|
|
|
|
use rand::Rng;
|
|
|
|
|
const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
|
|
|
|
|
abcdefghijklmnopqrstuvwxyz\
|
|
|
|
|
0123456789)(*&^%$#@!~";
|
|
|
|
|
const PASSWORD_LEN: usize = 30;
|
|
|
|
|
let mut rng = rand::thread_rng();
|
|
|
|
|
|
|
|
|
|
let password: String = (0..PASSWORD_LEN)
|
|
|
|
|
.map(|_| {
|
|
|
|
|
let idx = rng.gen_range(0..CHARSET.len());
|
|
|
|
|
CHARSET[idx] as char
|
|
|
|
|
})
|
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
|
|
println!("{:?}", password);
|
|
|
|
|
}
|
|
|
|
|
</code></pre></pre><div id=giscus-container></div></main><nav class=nav-wrapper aria-label="Page navigation"><a rel=prev href=../algos/awesome.html class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts=Left><i class="fa fa-angle-left"></i> </a><a rel=next href=../algos/sorting.html class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts=Right><i class="fa fa-angle-right"></i></a><div style=clear:both></div></nav></div></div><nav class=nav-wide-wrapper aria-label="Page navigation"><a rel=prev href=../algos/awesome.html class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts=Left><i class="fa fa-angle-left"></i> </a><a rel=next href=../algos/sorting.html class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts=Right><i class="fa fa-angle-right"></i></a></nav></div><script>window.playground_copyable=!0</script><script src=../ace.js charset=utf-8></script><script src=../editor.js charset=utf-8></script><script src=../mode-rust.js charset=utf-8></script><script src=../theme-dawn.js charset=utf-8></script><script src=../theme-tomorrow_night.js charset=utf-8></script><script src=../elasticlunr.min.js charset=utf-8></script><script src=../mark.min.js charset=utf-8></script><script src=../searcher.js charset=utf-8></script><script src=../clipboard.min.js charset=utf-8></script><script src=../highlight.js charset=utf-8></script><script src=../book.js charset=utf-8></script><script>var pagePath="algos/randomness.md"</script><script src=../assets/custom1.js></script><script src=../assets/bigPicture.js></script>
|