[C/C++]一些常用的随机函数实现

来源:互联网 发布:网络系统集成技术方案 编辑:程序博客网 时间:2024/06/04 01:14

实现了一些比较常见的随机函数接口,包括从区间中随机、根据概率数组随机、根据置位情况随机等,希望有参考作用。

头文件:

#ifndef _RANDOM_FUNC_#define _RANDOM_FUNC_bool is_random_hit(int x, int n = 100);int random_with_range(int a, int b);void test_random_func();int random_with_value_rate_array(int arr[][2], int count);int random_with_rate_array(int arr[], int count);int random_bit_off_index(int status, int n);int random_bit_on_index(int status, int n);#endif

实现文件:

#include "random_func.hpp"#include <iostream>#include<time.h>#include<stdlib.h>#include <string>#include <cassert>using namespace std;/** * @brief 是否命中概率 * @param x 概率为x/n * @param n 概率的基数 * @return true表示命中概率 */bool is_random_hit(int x, int n){assert(n != 0);int r = rand() % n;return x < r;}/** * @brief 从一个区间中随机一个数 * @param a 左界 * @param b 右界 * @return 随机的结果 */int random_with_range(int a, int b){//确保a < bif (a > b) {a ^= b ^= a ^= b;}//包含a和bint r = rand() % (b - a + 1);return r + a;}/** * @brief 根据概率数组,返回输出outid * @param arr 概率数组,会自动根据提供的数据计算概率,只支持整数 * @param count 行的数量,即有多少个 * @return 符合概率的数组下标 */int random_with_rate_array(int arr[], int count){// 默认的输出uint32_t outid = 0;uint32_t sum = 0; // 用于概率的统计int i;for (i = 0; i < count; i++) {sum += arr[i];}assert(sum != 0);int r = rand() % sum;sum = 0;for (i = 0; i < count; i++) {sum += arr[i];// 达到指定的概率if (r <= (int) sum) {outid = i;break;}}return outid;}/** * @brief 根据输出outid及概率的数组,返回输出outid * @param arr 概率数组,会自动根据提供的数据计算概率,只支持整数 * @param count 行的数量,即有多少个 * @return 符合概率的数组下标 */int random_with_value_rate_array(int arr[][2], int count){// 默认的输出uint32_t outid = arr[0][0];uint32_t sum = 0; // 用于概率的统计int i;for (i = 0; i < count; i++) {sum += arr[i][1];}assert(sum != 0);int r = rand() % sum;sum = 0;for (i = 0; i < count; i++) {sum += arr[i][1];// 达到指定的概率if (r <= (int) sum) {outid = arr[i][0];break;}}return outid;}/** * @brief 从指定数据status的前n位中随机出一个清位的位置 * @param status 数据 * @param n 前几位 * @return 符合概率的位下标,从1开始 */int random_bit_off_index(int status, int n){assert(n > 0);int result = 0;int vec[32];int size = 0;for (int i = 0; i < n; ++i) {//找到清位if (!(status & (1 << i))) {vec[size++] = i + 1;}}if (size > 0) {result = vec[rand() % size];}return result;}/** * @brief 从指定数据status的前n位中随机出一个置位的位置 * @param status 数据 * @param n 前几位 * @return 符合概率的位下标,从1开始 */int random_bit_on_index(int status, int n){assert(n > 0);int result = 0;int vec[32];int size = 0;for (int i = 0; i < n; ++i) {//找到置位的位置if ((status & (1 << i))) {vec[size++] = i + 1;}}if (size > 0) {result = vec[rand() % size];}return result;}void test_random_func(){srand((int) time(0));cout << string(70, '=') << endl;cout << "is_random_hit" << endl;for (int i = 0; i < 10; ++i) {cout << i << ": " << is_random_hit(50) << endl;}cout << string(70, '=') << endl;cout << "ranged_random" << endl;for (int i = 0; i < 10; ++i) {cout << i << ": " << random_with_range(100, 50) << endl;}cout << string(70, '=') << endl;cout << "random_with_rate_array" << endl;int arr[] = { 50, 50, };int count = 2;for (int i = 0; i < 10; ++i) {cout << i << ": " << random_with_rate_array(arr, count) << endl;}cout << string(70, '=') << endl;cout << "random_with_value_rate_array" << endl;int arr2[][2] = { { 1, 50 }, { 2, 50 }, };count = 2;for (int i = 0; i < 10; ++i) {cout << i << ": " << random_with_value_rate_array(arr2, count) << endl;}cout << string(70, '=') << endl;cout << "random_bit_off_index" << endl;count = 3;for (int i = 0; i < 10; ++i) {cout << i << ": " << random_bit_off_index(8, count) << endl;}cout << string(70, '=') << endl;cout << "random_bit_on_index" << endl;count = 3;for (int i = 0; i < 10; ++i) {cout << i << ": " << random_bit_on_index(6, count) << endl;}cout << "---- end of test random func -----------" << endl;}

某次的运行结果:

======================================================================is_random_hit0: 01: 12: 03: 14: 05: 06: 07: 18: 09: 1======================================================================ranged_random0: 531: 522: 903: 514: 625: 856: 507: 548: 519: 84======================================================================random_with_rate_array0: 11: 12: 13: 14: 15: 06: 17: 08: 09: 0======================================================================random_with_value_rate_array0: 21: 12: 23: 24: 25: 26: 27: 18: 29: 2======================================================================random_bit_off_index0: 31: 12: 13: 34: 35: 36: 37: 28: 39: 1======================================================================random_bit_on_index0: 21: 32: 23: 34: 25: 36: 37: 38: 39: 2---- end of test random func -----------


0 0
原创粉丝点击