基础算法——概率

  

/*************************************************************************
    > File Name: probability.cpp
    > Author: xinyang
    > Mail: [email protected]
    > 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;
}
时间: 2024-10-06 23:42:52

基础算法——概率的相关文章

贝叶斯公式由浅入深大讲解—AI基础算法入门

1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定的值.比如如果问那时的人们一个问题:"有一个袋子,里面装着若干个白球和黑球,请问从袋子中取得白球的概率是多少?"他们会想都不用想,会立马告诉你,取出白球的概率就是1/2,要么取到白球,要么取不到白球,即θ只能有一个值,而且不论你取了多少次,取得白球的概率θ始终都是1/2,即不随观察结果X

基础算法之排序--快速排序

1 /************************************************************************************** 2 * Function : 快速排序 3 * Create Date : 2014/04/21 4 * Author : NTSK13 5 * Email : [email protected] 6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 7 * 任何单位和个人不经本人允许不

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

算法录 之 基础算法

这一篇文章主要说说一些基础算法,这些算是很多其他算法的基石. 主要包括  模拟,暴力,枚举,递归,贪心,分治. 1,模拟: 顾名思义,模拟就是...饿,模拟,有一些题目就是给你一些步骤,然后你写代码一步步去模拟那些步骤就行.这类题目主要属于基础题,但是当然如果需要模拟的步骤足够恶心的话,还是比较麻烦的... 具体模拟的例子在之后的练习中会遇到的,按照题目要求一步步做就行,一般算法难度比较小. 2,暴力: 顾名思义,暴力就是...饿,暴力.比如说题目让从平面上的10个点中取三个点,让他们形成的三角

最最最最最最最最基础的C---C简介和基础算法

C简介 C是一门程序设计语言,面向过程的语言.于1972至1973年设计出来的语言. C具有32个关键字,9种控制语句,34种运算符. 函数是C的基本单位:一个C程序的执行总是从main函数开始的. C程序运行步骤:源程序--编译-->目标文件--执行-->可执行目标程序. 基础算法 完整的程序设计=数据结构+算法+程序设计方法+语言工具 算法特效: 1.有穷性:一个算法包含有限的操作步骤 2.确定性:确定算法的每一个步骤都是确定的 3.有零个或多个输入 4.有一个或多个输出 5.有效性:算法

基础算法

c语言基础算法大全 冒泡排序 选着排序 插入排序 快速排序 shell排序. 合并排序. 下面是各个排序算法的实现: 冒泡排序 void bobuleSort(int a[], int len) { int i,j,flag =1; for(i = 0; i<len; i++) { for(int j =len-1; j>i; j--) { if(a[j] <= a[i]) { int tmp = a[j]; a[j] = a[i]; a[i] = tmp; flag = 0; } }

复习基础算法的感想

晚上做杭电OJ,第二题是一个比较直观的题,我也是太直观了.贴出代码,供自己反省,从7点15分一直做到结束,wa9次....orz....看来自己的算法功底还差的很远很远. 接下的几天,学习大白上的基础 算法部分. #include<iostream> #include<stdio.h> #include<cstring> using namespace std; char a[20],b[20]; char c[20]; void shuchu(int num) { i

二叉树基础算法总结

记录一些二叉树的基础算法 二叉树节点结构: typedef struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *right; }TreeNode,*Node; 1.遍历 前.中.后序递归遍历: void pre_order_traversal(TreeNode *root){ if(root! = NULL){ visit(root); pre_order_traversal(root->left); pre_ord

PHP基础算法

1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo ' '; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2.冒泡排序,C里基础算法,从小到大对一组数排序. 思路:这题从小到大,第一轮排最小,第二轮排第二小