第四章:随机数

1.第2题解答

找到t对应的下标后,继续向左线性查找相等元素,直到遇到不相等的元素。

2.第6题解答

1.1结论

每次执行一次,罐子中的豆子数量就减去1,所以此过程可以终止。如果开始时候白豆的个数为奇数,那么最后留下的是白豆的,否则为黑豆的。(source)

1.2编码验证

#include<iostream>
#include<vector>
#include<algorithm>
#include<random>

using namespace std;

enum color{ black, white };

unsigned rand(int n){
    uniform_int_distribution<unsigned> u(0, n);
    static default_random_engine e;
    return u(e);
}

void lastBean(vector<color> &bean1,vector<color> &bean2){
    vector<color> bean(bean1.size() + bean2.size());
    merge(bean1.begin(), bean1.end(), bean2.begin(), bean2.end(), bean.begin());
    unsigned i, j;
    while (bean.size()>1){
        i = rand(bean.size() - 1);
        j = rand(bean.size() - 1);
        while (j == i){
            j = rand(bean.size() - 1);
        }
        if (bean[i] == bean[j]){
            if (i<j){
                swap(i, j);
            }
            bean.erase(bean.begin() + i);
            bean.erase(bean.begin() + j);
            bean.push_back(black);
        }
        else{
            if (bean[i] == black){
                bean.erase(bean.begin() + i);
            }
            else{
                bean.erase(bean.begin() + j);
            }
        }
    }
    cout <<bean[0] << endl;
}

int main(){
    vector<color> bean1(11, black);
    vector<color> bean2(12, black);
    vector<color> bean3(11, white);
    vector<color> bean4(12, white);
    lastBean(bean1, bean3);//开始时有奇数颗白豆
    lastBean(bean2, bean3);
    lastBean(bean1, bean4);//开始时有偶数颗白豆
    lastBean(bean2, bean4);
    system("pause");
    return 0;
}

运行结果:(0->黑,1->白)

1.3随机数问题

因为要随机选择两颗豆子,所以需要根据随机数范围生成一对不相等随机数。方法如下:

  1. 对不同的n需生成不同的分布
  2. 对同一个n(即同一分布)需生成新的随机数

最终编写的随机函数如下:

unsigned rand(int n){
    uniform_int_distribution<unsigned> u(0, n);
    static default_random_engine e;
    return u(e);
}

Explian:

unsigned rand(int n){
    uniform_int_distribution<unsigned> u(0, n);
    default_random_engine e;
    return u(e);
}

对于上述代码,随机数引擎e会生成一个随机序列(可能含有相同的数),不断调用u(e)会生成一个[0,n]之间的随机数序列(可能含有相同的数,记为序列S),问题是每次调用函数rand(n)都会返回S中的第一个数,这不是我们想要的,为此需在default_random_engine e 前加上static,这样e在函数rand(n)调用之间会保持状态,即调用rand(n)会依次返回S中的随机数。至此,条件2已得到满足。为满足条件1,uniform_int_distribution<unsigned> u(0,n) 前不加static即可。有时两个地方均要加static(见C++ Primer中文版P662)。

这样做并不能保证对于同一个n生成的一对随机数不相等,编写如下代码解决:

i = rand(bean.size() - 1);
j = rand(bean.size() - 1);
while (j == i){
    j = rand(bean.size() - 1);
}
时间: 2024-10-14 01:02:50

第四章:随机数的相关文章

第四章(上)

第四章 The cv::Mat Class: N-Dimensional Dense Arrays Mat n维稠密阵列 The cv::Mat class can be used for arrays of any number of dimensions. The data is                  mat可以作为任意维的数组.这些数据可以被认为以"光栅扫描" stored in the array in what can be thought of as an n-

第四章 数组,字符串和指针

数组 数组若没有指定初始值则为内存遗留值 如果指定了部分初始值,那么其余部分也默认被指定为0: long data[100]={0};          //给data数组的所有元素赋0 字符串是附加有特殊字符(/0)的字符序列 数组的填充: char president[]="thank you"; wchar_t president[]=L"thank you";     //Unicode字符串 const int max=80; char name[max]

【TIJ4】第四章全部习题

第四章 没啥好说的...... 4.1 1 package ex0401; 2 //[4.1]写一个程序打印从1到100的值 3 4 public class PrintOneToHundred 5 { 6 public static void main(String[] args) 7 { 8 for(int i = 1; i <= 100; ++i) 9 System.out.print(i + " "); 10 } 11 } 4.1 4.2-4.3 1 package ex

Java编程思想第四版 第四章个人练习

第四章 练习1:(1)写一个程序,打印1到100的值 public static void main(String[] args) { test(100); } public static void test(int num){ int i=0; while(i<num){ System.out.print(++i); if(i!=100){ System.out.print("."); } } System.out.println(); int j=0; do{ System.

《python for data analysis》第四章,numpy的基本使用

<利用python进行数据分析>第四章的程序,介绍了numpy的基本使用方法.(第三章为Ipython的基本使用) 科学计算.常用函数.数组处理.线性代数运算.随机模块-- # -*- coding:utf-8 -*-# <python for data analysis>第四章, numpy基础# 数组与矢量计算import numpy as npimport time # 开始计时start = time.time() # 创建一个arraydata = np.array([[

《利用Python进行数据分析&#183;第2版》第四章 Numpy基础:数组和矢量计算

<利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对象.其C语言编写的算法库可以操作内存而不必进行其他工作.比起内置序列,使用的内存更少(即时间更快,空间更少) numpy可以在整个数组上执行复杂的计算,而不需要借助python的for循环 4.0 前提知识 数据:结构化的数据代指所有的通用数据,如表格型,多维数组,关键列,时间序列等 相关包:numpy pa

第四章

第四章 源代码的下载和编译 1.下载.编译和测试Android源代码 配置Android源代码的下载环境 ①创建一个存放下载脚本文件(repo)的目录 # mkdir  ~/bin # PATH=~/bin:$PATH ②下载repo脚本文件 # curi http://dl-ssl.google.com/dl/googlesource/git-repo/repo > -/bin/repo # chmod a+x ~/bin/repo ③创建存放Android源代码的目录 # mkdir and

《UML精粹》 第四章 时序图

第四章 时序图 一般来说,我们会在一张时序图中画出某个情节的相关行为,图种会秀出这个使用案例(use case)里面可能出现的一些对象,以及在对象间传送的信息. 本章将通过一个简单情节,做时序图各方面的相关讨论.假设我们现在有一份订单,并且准备调用它的一个命令,算出这份订单的价格.为了达到这个目的,订单需要产看它里面所拥有的一些订单明细.决定它们的价格,价格决定方式是以订单明细中所包含产品之定价规则为基础决定的.对所有订单明细做完上述动作之后,接下来订单要算出整个折扣,这时候它是以跟客户绑在一起

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

2017.06.29数据挖掘基础概念第四章

第四章39.为什么在进行联机分析处理(OLAP)时,我们需要一个独立的数据仓库,而不是直接在日常操作的数据库上进行 1.提高两个系统的性能 2.操作数据库支持多事务的并发处理,需要并发控制和恢复机制,确保一致性和事务的鲁棒性 3.两者有着不同的数据的结构.内容和用法40.什么是数据仓库 数据仓库是一种数据库,它与单位的操作数据库分别维护,数据仓库系统允许将各种应用系统集成在一起,为统一的历史数据分析提供坚实的平台,对信息处理提供支持,是一个面向主题的.集成的.时变得.非易失的数据集合,支持管理者