学习 Rust cookbook 之算法篇(algorithm)

前言

一直以来,我都沉迷于如何学好 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 即可编译通过并运行。

参考资料

学习 Rust cookbook 之算法篇(algorithm)的更多相关文章

  1. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  2. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  3. 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看

    从决策树学习谈到贝叶斯分类算法.EM.HMM     引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全 ...

  4. 从决策树学习谈到贝叶斯分类算法、EM、HMM

    从决策树学习谈到贝叶斯分类算法.EM.HMM                (Machine Learning & Recommend Search交流新群:172114338) 引言 log ...

  5. 用Spark学习矩阵分解推荐算法

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib ...

  6. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

  7. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

  8. 条件随机场CRF(三) 模型学习与维特比算法解码

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在CRF系列的前两篇,我们总结了CRF的模型基 ...

  9. c/c++ 通用的(泛型)算法 generic algorithm 总览

    通用的(泛型)算法 generic algorithm 总览 特性: 1,标准库的顺序容器定义了很少的操作,比如添加,删除等. 2,问题:其实还有很多操作,比如排序,查找特定的元素,替换或删除一个特定 ...

随机推荐

  1. 如何知道一个路由器的 BSSID ?

    使用 Mac 连接上这个路由器,然后使用 option 按 wifi 按钮,可以在详情页里找到. 有些路由中继的设置需要使用 BSSID ,比如 pandorabox openwrt

  2. opencv —— resize、pyrUp 和 pyrDown 图像金字塔(高斯金字塔、拉普拉斯金字塔)与尺寸缩放(向上采样、向下采样)

    我们经常会将某种尺寸的图像转化为其他尺寸的图像,如果需要放大或者缩小图像的尺寸,在 OpenCV 中可以使用如下两种方法: resize 函数,最直接的方法. pyrUp 和 pyrDown 函数,即 ...

  3. 第2章 在 HTML中 使用 JavaScript

    第2章 在 HTML中 使用 JavaScript 2.1 script 元素 2.1.1 标签的位置 2.1.2 延迟脚本 2.1.3 异步脚本 2.1.4 在XHTML中的使用 2.1.5 不推荐 ...

  4. Unity比较常用的数据类型

    几种常见数据结构的使用情景 Array需要处理的元素数量确定并且需要使用下标时可以考虑,不过建议使用List<T> ArrayList不推荐使用,建议用List<T> List ...

  5. BZOJ #5457: 城市 [线段树合并]

    线段树合并的板子题,每次从下到上合并就完事了 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define re ...

  6. 将一个Head下的Line复制到另一个Head下(ef+linq)

    今天工作中有一个需求,要求将一个Item下的Line复制到另外一个Item下面 这个需求在工作中很多,按照以往的经验肯定是先delete from,然后再一条条遍历后insert into 这两天正好 ...

  7. 破解版 Teamver 安装

    一 .下载安装包 百度网盘链接:https://pan.baidu.com/s/18nEKAMmHEqU66Dq_aCnEYQ 提取码:2x2q 二.解压缩后,直接运行红框内绿色文件即可

  8. 非maven配置SpringBoot框架

    简介 最近看SpringBoot框架非常火,所以尝试的参照资料学习了一下SpringBoot框架, 起初是搭建的maven项目,可是个人觉得maven项目搭建起来不太方面(还有网络 原因),所以我这性 ...

  9. springboot的yml配置文件里有多个参数的调用方式

    本篇教程适用于配置文件一级下有多个二级或三级时,如何在service层不用通过多个@Value就能获取配置文件的参数 例如yml配置是这样的: 如果service层要引用这些参数,用多个@Value( ...

  10. Unity踩坑记录

    最近开始学习Unity,因为会一点儿C#,Delphi,Python,三种都是半桶水都算不上的级别. 首先排除了Python,其次delphi是我最喜欢的,奈何它目前我能了解到的引擎都很老了,dilp ...