学习 Rust cookbook 之算法篇(algorithm)

   2023-02-09 学习力0
核心提示:原文作者:suhanyujie永久链接:https://github.com/suhanyujie/rust-cookbook-note博客链接:https://ishenghuo.cnblogs.com前言一直以来,我都沉迷于如何学好 Rust 而无法自拔,以至于“想”的时间比“做”的时间还多。chrome 上日积月累的 tab 数量,是我

前言

一直以来,我都沉迷于如何学好 Rust 而无法自拔,以至于“想”的时间比“做”的时间还多。chrome 上日积月累的 tab 数量,是我愈发的焦躁,当我尝试从其中一个 tab 下手时,god ,有点看不懂,我对 Rust 语法还知之甚少,于是还是无法“学习掉”那个 tab。下意识的翻到页面底部,又发现另一篇 Rust 博文,嗯!看起来很有技术含量,想学,mark 一下。。。

很不幸的,当我决定从众多 tab 中选一个来进行“消化”时,我找到了这个 Rust cookbook,它包含了 算法、命令行、数据压缩、并发、数据加密、日期和时间、编解码、错误处理、文件系统、硬件支持、内存管理、网络、操作系统、统计学、文本处理、web 服务等章节,当你学习了《Rust 编程语言》一书后,可以从更加实用的角度来学习这本 cookbook

algorithm 篇简介

第一节算法篇,主要包含生成随机数、数组排序等内容,请注意,学习这篇 Rust 笔记之前,请一定要阅读完《Rust 编程语言》。之后,再与我一同学习 Rust cookbook。

实战

教程中,教我们使用 rand::thread_rngrand::Rng 方法生成随机数。每个线程都会初始化一个随机数生成器。如果是获取整数,则整数是在其类型内均匀分布的,如果是浮点数,则是在 0 和 1 但不包含 1 之前均匀分布的。接下来,编写代码

首先新建可运行的项目:

cargo new --bin cookbook
cd cookbook

在 main.rs 同级目录下新建 algorithm.rs 文件,我们采用每一章一个 mod (一个文件)的方式,写示例程序。文件目录结构如下:

├── Cargo.lock
├── Cargo.toml
├── src
│   ├── algorithm.rs
│   └── main.rs
└── target

在 dependencies 下加入 rand crate 依赖,Cargo.toml 内容如下:

[package]
name = "cookbook"
version = "0.1.0"
authors = ["suhanyujie <suhanyujie@qq.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.7.3"

生成指定类型的随机数

此时命令行下运行 cargo test 时,会自动下载 rand crate 内容。接下来,可以根据 rand crate 官方文档示例,在 algorithm.rs 文件中编写一个生成一个类型为 u8 的随机数:

extern crate rand;

use rand::Rng;

pub fn gen_a_u8_num() -> u8 {
    let mut rng = rand::thread_rng();

    let n1: u8 = rng.gen();
    return n1;
}

在 main.rs 文件中进行调用该函数:

mod algorithm;

use algorithm::*;

fn main() {
    let n1 = gen_a_u8_num();
    println!("Rand num of u8 is:{}", n1);
}

代码写好了,运行一下试试 cargo run,执行成功,在终端会打印出形如 Rand num of u8 is:135 的一句话。我将源码放到了 Github 的仓库中,点击可以查看

生成指定范围的随机数

  • 在平时的业务代码中,直接获取一个随机数的场景还是比较少的,大都是以下场景:
    • 在给定的一个数组中,随机获取其中的一个
    • 获取指定范围内的随机数
  • 这里我们先探讨以下如何用 Rust 生成指定范围内的随机数。rand crate 中提供了这样的 api,通过 Rng::gen_range 获取一个半开区间范围的随机值,使用方式如下:
let mut rng = rand::thread_rng();
let num = rng.gen_range(0, 100);
  • 通过这种方式,即可获取一个从 0 到 100,但不包括 100 的随机数。简单地封装成 函数:
pub fn gen_random_within_range(min: isize, max: isize) -> isize {
    let mut rng = rand::thread_rng();
    let num = rng.gen_range(min, max);
    return num as isize;
}
  • 使用命令 cargo run 即可编译通过并运行。
  • 在 PHP 中,标准库函数自带了 rand 用于生成指定范围内的随机数,不仅如此,还有一个比 rand 更好的方式生成随机数 mt_rand。Rust 的 rand crate 中也提供了一个比上面 gen_range 的方式更好的生成随机数方式 Uniform。因此我们也尝试一下编写 Rust 版本的 mt_rand:
/// 用更好的方式生成指定范围内的随机数
pub fn mt_rand(min: isize, max: isize) ->isize {
    let mut rng = rand::thread_rng();
    let die = Uniform::from(min..max);
    let num = die.sample(&mut rng);
    num as isize
}
  • 使用命令 cargo run 即可编译通过并运行。

参考资料

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • bloom-server 基于 rust 编写的 rest api cache 中间件
    bloom-server 基于 rust 编写的 rest api cache
    bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同时他使用基于share 的概念,进行cache 的分布存储,包含了请求端口(proxy,访问数据) 以及cache 控制端口(
    03-08
  • #新闻拍一拍# Oracle 调研如何避免让 Java 开发者投奔 Rust 和 Kotlin | Linux 中国
    #新闻拍一拍# Oracle 调研如何避免让 Java 开发
     导读:• 英特尔对迟迟不被 Linux 主线接受的 SGX Enclave 进行了第 38 次修订 • ARM 支持开源的 Panfrost Gallium3D 驱动本文字数:977,阅读时长大约:1分钟作者:硬核老王Oracle 调研如何避免让 Java 开发者投奔 Rust 和 KotlinOracle 委托分析公司 Omd
    03-08
  • Linux系统下Rust快速安装:国内镜像加速
    Linux系统下Rust快速安装:国内镜像加速
    官方网址和方法Install Rust - Rust Programming Language然而速度慢得让人难以置信。利用国内镜像进行windows的Linux子系统的Rust安装。rust 使用国内镜像,快速安装方法参考:RUST安装慢怎么办,使用镜像方式安装_网络_为中华之崛起而编程-CSDN博客我的操作
    03-08
  • Rust到底值不值得学--Rust对比、特色和理念
    前言其实我一直弄不明白一点,那就是计算机技术的发展,是让这个世界变得简单了,还是变得更复杂了。当然这只是一个玩笑,可别把这个问题当真。然而对于IT从业者来说,这可不是一个玩笑。几乎每一次的技术发展,都让这个生态变得更为复杂。“英年早秃”已经成
    03-08
  • 超33000行新代码,为Linux内核添加Rust支持的补丁已准备就绪
    超33000行新代码,为Linux内核添加Rust支持的补
    https://mp.weixin.qq.com/s/oKw9aBJSdmRoO6-rbLAkNw7 月 4 日,一套修订后的补丁被提交至 Linux 内核的邮件列表中,该补丁为在 Linux 内核中以 Rust 作为辅助编程语言提供了支持,借助 Rust 可以提高 Linux 内核和内存的安全。整套补丁包含 17 个子项,不光
    03-08
  • 【译】Rust 的 Result 类型入门
    【译】Rust 的 Result 类型入门
    A Primer on Rust’s Result Type 译文原文链接:https://medium.com/@JoeKreydt/a-primer-on-rusts-result-type-66363cf18e6a原文作者:Joe Kreydt译文出处:https://github.com/suhanyujie/article-transfer-rs译者:suhanyujietips:水平有限,翻译不当之
    03-08
  • Rust实战系列-基本语法
    Rust实战系列-基本语法
    主要介绍 Rust 的语法、基本类型和数据结构,通过实现一个简单版 grep 命令行工具,来理解 Rust 独有的特性。本文是《Rust in action》学习总结系列的第二部分,更多内容请看已发布文章:一、Rust实战系列-Rust介绍“主要介绍 Rust 的语法、基本类型和数据结
    03-08
  • 全栈程序员的新玩具Rust(三)板条箱
    上次用到了stdout,这次我们来写一个更复杂一点的游戏rust的标准库叫做std,默认就会引入。这次我们要用到一个随机数函数,而随机数比较尴尬的一点是这玩意不在标准库中,我们要额外依赖一个库。很多编程方案都有自己的模块化库系统,rust也不例外,不过rust
    02-10
  • 全栈程序员的新玩具Rust(六)第一个WASM程序
    全栈程序员的新玩具Rust(六)第一个WASM程序
    先上代码https://gitee.com/lightsever/rust_study/tree/master/wasm_hello01webassembly就不用再赘述了,耳朵里面快磨出茧子来了。rustwasm是火狐自家的玩具,让我们来继续做实验,让rust飞起来吧。环境安装安装好rust环境之后仍然需要 一个 wasm 工具包carg
    02-10
  • 【Rust】标准库-Result rust数据库
    环境Rust 1.56.1VSCode 1.61.2概念参考:https://doc.rust-lang.org/stable/rust-by-example/std/result.html示例main.rsmod checked {#[derive(Debug)]pub enum MathError {DivisionByZero,NonPositiveLogarithm,NegativeSquareRoot,}pub type MathResult =
    02-09
点击排行