学习 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. shell 一键配置单实例oracle基础环境变量(linux7)

    #!/bin/bash echo "修改主机名" hostnamectl set-hostname wangxfa hostname sleep 1 echo "查看并关 ...

  2. 笔记-Git基础

    git配置 git config --global user.name "xxx" //配置用户名 git config --global user.email "xxx ...

  3. cf1280B

    题意:给出一个n*m的矩阵,矩阵中的元素要么P要么是A 每次可以选择一个的子矩形,然后将矩阵中每一行都变为第一行,或者将矩阵中每一列都变为第一列 要求用最少的次数将矩阵中所有元素都变成A 题解:分类讨 ...

  4. warning: LF will be replaced by CRLF in

    warning: LF will be replaced by CRLF in analysis/Result.csv. The file will have its original line en ...

  5. 小Z的袜子(hose) HYSBZ - 2038 莫队+分块

    #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll>pl ...

  6. Dolphin Scheduler初始化Postgresql数据库失败

    在执行sh script/create-dolphinscheduler.sh初始化数据库时报错: 07:05:03.070 [main] ERROR com.alibaba.druid.pool.D ...

  7. springboot打成war包并携带第三方jar包

    1.修改打包方式为war     <packaging>war</packaging> 2.添加第三方依赖的jar到pom     我的第三方jar包在resoueces目录下 ...

  8. UVA-1588

    只用C来写 题目:https://vjudge.net/problem/UVA-1588 #include<stdio.h> #include<string.h> #defin ...

  9. Perl-统计文本中各个单词出现的次数(NVDIA2019笔试)

    1.原题 2.perl脚本 print "================ Method 1=====================\n"; open IN,'<','an ...

  10. 关于新版vue-cli安装json-server在build文件里没生成出dev-server文件

    今天在安装json-server时遇到一个问题,build文件里并没有生成dev-server.js文件, 开始是怀疑配置有问题,或者安装不正确,然后重新安装了两三次,还是这样,郁闷.. 通过查询资料 ...