zoukankan      html  css  js  c++  java
  • 第四章:随机数

    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;
    }
    View Code

    运行结果:(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);
    }
  • 相关阅读:
    考试题1
    九九乘法表
    面向对象
    *****用循环运用
    编辑实现逻辑运算和循环计数
    求:1-3+5-7+...-99+101的值的(分析求解)。
    三层for循环求解组成三角形边的组合
    for循环的应用
    Java基础输出语句
    习题4 编写一个方法method(),判断一个数能否同时被3和5整除
  • 原文地址:https://www.cnblogs.com/bukekangli/p/4318147.html
Copyright © 2011-2022 走看看