随机化算法之随机数

首先是介绍:

代码如下:

//随机数类
//Random.hpp
//=====================================================
#ifndef RANDOM_HPP
#define RANDOM_HPP

#include<ctime>

const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;

class RandomNumber{
private:
    //当前种子
    unsigned long randSeed;
public:
    RandomNumber(){};
    RandomNumber(unsigned long s = 0);  //构造函数,默认值0表示由系统自动产生种子
    unsigned short Random(unsigned long n);  //产生0:n-1之间的随机整数
    double fRandom(void);  //产生[0 , 1)之间的随机整数
};

RandomNumber::RandomNumber(unsigned long s)  //产生种子
{
    if (s == 0)
    {
        randSeed = time(0);  //使用系统时间产生随机种子
    }
    else
    {
        randSeed = s;
    }
}

unsigned short RandomNumber::Random(unsigned long n)  //产生 0:n-1之间的随机整数
{
    randSeed = multiplier * randSeed + adder;
    return(unsigned short)((randSeed >> 16) % n);
}

double RandomNumber::fRandom(void)  //产生[0 , 1)之间的随机数
{
    return Random(maxshort) / double(maxshort);
}

#endif
//随机数
//main.cpp
//==============================================
#include <iostream>
#include <iomanip>
#include "Random.hpp"

using namespace std;

int TossCoins(int numberCoins)
{
    //随机抛硬币
    static RandomNumber coinToss(0);
    int tosses = 0;
    for (int i = 0; i < numberCoins; i++)
    {
        tosses += coinToss.Random(2);
    }
    return tosses;
}

int main(void)
{
    //模拟随机抛硬币事件
    const int NCOINS = 10;
    const long NTOSSES = 50000L;
    //heads[i]是得到i次正面的次数
    long heads[NCOINS + 1];
    int position;
    //初始化数组heads
    for (int i = 0; i < NCOINS + 1; i++)
    {
        heads[i] = 0;
    }
    //重复50000次试验
    for (int j = 0; j < NTOSSES; j++)
    {
        heads[TossCoins(NCOINS)] ++;
    }
    //输出频率图
    for (int i = 0; i < NCOINS; i++)
    {
        position = int(float(heads[i]) / NTOSSES * 72);
        cout << setw(6) << i << " ";
        for (int j = 0; j < position - 1; j++)
        {
            cout << " ";
        }
        cout << "*" << endl;
    }

    system("pause");
}

结果如下(频率图):

原文地址:https://www.cnblogs.com/zf-blog/p/9064433.html

时间: 2024-10-29 06:28:20

随机化算法之随机数的相关文章

POJ3318--Matrix Multiplication 随机化算法

Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? Input The first line of input contains a positive integer n (n ≤ 500) followed by the the three matrices A, B and C respectively. Each matrix's descript

POJ 3318 Matrix Multiplication(随机化算法)

给你三个矩阵A,B,C.让你判断A*B是否等于C. 随机一组数据,然后判断乘以A,B之后是否与乘C之后相等. 很扯淡的啊,感觉这种算法不严谨啊... Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16255   Accepted: 3515 Description You are given three n × n matrices A, B and C. Does the e

PKU 2531 Network Saboteur(dfs+剪枝||随机化算法)

题目大意:原题链接 给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大. 标记:A集合:true  B集合:false 解法一:dfs+剪枝 #include<iostream> #include<cstring> using namespace std; int n,ans; bool in[25]; int graph[25][25]; void dfs(int i

快速排序的随机化算法

快速排序在最坏情况下的复杂度较高,采取随机化算法选择每次的分割点,能够在一定程度上使每次划分的平衡性更好. // // main.cpp // eoj1807 // // Created by Fangpin on 15/3/15. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdlib> #include <cstdio> #includ

[ACM] POJ 3318 Matrix Multiplication (随机化算法)

Matrix Multiplication Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16118   Accepted: 3485 Description You are given three n × n matrices A, B and C. Does the equation A × B = C hold true? Input The first line of input contains a posit

机器学习算法中随机数的生成

numpy,sklearn提供随机数据生成功能,我们可以自己生成适合某一种模型的数据,用随机数据来清洗,归一化,转换,然后选择模型与算法做拟合和预测. 1.numpy随机数据生成API numpy比较适合用来生产一些简单的抽样数据.API都在random类中,常见的API有: (1).rand(d0, d1, ...,dn)用来生成d0xd1x...dn维的数组.数组的值在[0, 1]之间. (2).randn(d0, d1, ...,dn),也是用来生成d0xd1x...dn维的数组.不过数组

算法练习-随机数

问题表述:生成小于n且没有重复的k个整数的问题. 输入:n,k. 输出:0-n-1之间的k个不同随机顺序的随机整数. 随机数产生函数为rand(),函数的作用是生成一个0~RAND_MAX之间的一个随机数,返回值是一个unsigned int类型值,代码如下. #include <iostream> using namespace std; void main() { for (int i = 0; i < 10; ++i) { cout<<rand()<<&qu

UOJ#75. 【UR #6】智商锁 随机化算法 矩阵树定理

原文链接www.cnblogs.com/zhouzhendong/p/UOJ75.html 前言 根本没想到. 题解 首先我们可以考虑一种做法: 找一些图,使得他们各自的生成树个数乘起来等于 k. 那么只要将他们用一条链连起来就得到答案了. 接下来考虑如何得到这些图. 考虑随机生成一个 n 个点的图,它的生成树个数最大是 $n^{n-2}$ . 我们假装一个 n 个点的图的生成树个数是 $[0,n^{n-2}]$ 中的随机数. 假设我们随机生成了 S 个这样的图,如果我们在这 S 个图中随机选择

【随机化算法】codeforces Matrix God

http://codeforces.com/gym/101341 [题意] 给定三个方阵A,B,C,问AB=C是否成立? 方阵的规模最大为1000 [思路] 求AB的时间复杂度为n*n*n,会超时 左乘一个一行n列的向量,时间复杂度降为n*n [Accepted] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algor