• 基础算法——概率


      

    /*************************************************************************
        > File Name: probability.cpp
        > Author: xinyang
        > Mail: xuechen.xy@gmail.com 
        > Created Time: Wed 07 Oct 2015 03:11:56 PM CST
     ************************************************************************/
    
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <vector>
    using namespace std;
    
    /*
     * 获取从a到b之间的一个随机数
     */
    int get_random(int a, int b) {
        srand((unsigned)time(NULL));
        return rand()%(b - a) + a ;
    }
    
    /*
     * 从1, 2, ..., n中找出k个不重复的随机数
     */
    void get_k_random(int A[], int n, int k, vector<int> &ret) {
        if (A == NULL || n <= 0 || k > n) {
            return ;
        }
    
        int num = n - 1;
        int index;
        for (int i = 0; i < k; ++i) {
            index = get_random(0, num);
            int tmp = A[index];
            A[index] = A[num];
            A[num] = tmp;
            ret.push_back(A[num]);
            --num;
        }
    }
    
    /*
     * 从一个数组中等概率返回一个最大数
     */
    int get_random_max(int A[], int n) {
        if (A == NULL || n <= 0) {
            cout << "array is null" << endl;
            return -1;
        }
    
        int max = A[0];
        int max_count = 1;
        vector<int> max_vec;
        max_vec.push_back(0);
        for (int i = 1; i < n; ++i) {
            if (max == A[i]) {
                max_vec.push_back(i);
                max_count ++;
            } else if (max < A[i]) {
                max = A[i];
                while (!max_vec.empty()) {
                    max_vec.pop_back();
                }
                max_count = 1;
                max_vec.push_back(i);
            }
        }
    
        int aim_index = get_random(0, max_count - 1);
        return A[max_vec[aim_index]];
    }
    
    /*
     * 从一个数组(n个数)中等概率返回m个数(m <= n)
     */
    void get_random_m_digits(int A[], int n, int B[], int m) {
        if (A == NULL || n <= 0 || B == NULL || m <= 0 || m > n) {
            return;
        }
        
        vector<int> rand_array;
        int *TMP = new int[n];
        for (int i = 0; i < n; ++i) {
            TMP[i] = i;
        }
        get_k_random(TMP, n, m, rand_array);
        delete[] TMP;
        TMP = NULL;
    
        for (int i = 0; i < m; ++i) {
            B[i] = A[rand_array[i]];
        }
    }
    
    void genknuth(int m, int n) {
        clock_t start, end;
        start = clock();
        srand(time(NULL));
        for(int i = 0; i < n; i++) {
            if(rand() % (n - i) < m) {
                cout << i << endl;
                if(!(--m)) {
                    break;
                }
            }
        }
    
        end = clock();
        cout << "Process took " << 
            (double(end - start) / CLOCKS_PER_SEC) << "seconds" << endl;
        return ;
    }
    
    int main() {
        int A[100];
        for (int i = 0; i < 100; ++i) {
            A[i] = i + 1;
        }
    
        cout << "从1, ..., 100获取50个随机数" << endl;
        vector<int> random_without_dup;
        get_k_random(A, 100, 50, random_without_dup);
        for (unsigned int i = 0; i < random_without_dup.size(); ++i) {
            cout << random_without_dup[i] << ' ';
        }
        cout << endl << endl;
    
        cout << "从一个数组中随机返回一个最大数" << endl;
        int B[] = {1, 2, 5, 5};
        cout << get_random_max(B, 4) << endl;
        cout << endl;
    
        cout << "从一个包含n个数的数组中随机抽取m个数" << endl;
        int C[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int *D = new int[5];
        get_random_m_digits(C, 10, D, 5);
        for (int i = 0; i < 5; ++i) {
            cout << D[i] << ' ';
        }
        cout << endl << endl;;
    
        cout << "从1, ..., n中随机选m个数字" << endl;
        genknuth(5, 10);
    
        return 0;
    }
  • 相关阅读:
    2021“MINIEYE杯”中国大学生算法设计超级联赛2
    2021“MINIEYE杯”中国大学生算法设计超级联赛1
    2021牛客暑期多校训练营3
    2021牛客暑期多校训练营1
    对点分治的一些新理解
    使用均摊分析证明Splay复杂度
    从实际项目中学设计模式:策略模式与模板模式的应用
    ueditor编辑器html模式下无法保存内容
    记录一次项目开发中遇到的问题
    加解密代码
  • 原文地址:https://www.cnblogs.com/yiyi-xuechen/p/4858770.html
Copyright © 2020-2023  润新知