C++中的随机数函数(


标签:ul 随机数 c 整数 max 教育 

C++中产生随机数种子对于刚開始学习的人一直都非常困惑.大家知道,在C中有专门的srand(N)函数能够轻松实现这一功能,然而在C++中则要复杂一些.以下是笔者学习的一点心得,希望对大家能有所帮助.(这里我们依旧要借助C标准库中的rand()函数)

函数说明:

int rand();                                          :返回从[0,MAX)之间的随机整数,这里的MAX与你所定义的数据类型而定;需#include <cstdlib>

void srand( unsigned seed );                         :设置随机数种子,#include <cstdlib>

time_t time( time_t *time );                         :返回当前时间,#include <ctime>

应用举例:
1):
srand(time(0));                                           //依据系统时间设置随机数种子
int i = rand() % N;                                       //取得区间[0,N)的整数

如要产生1~10之间随机数,则代码例如以下:

#include <iostream>
using namespace std;

#include <ctime>
#include <cstdlib>

int main()
{
         int t;
         srand(time(0));       //seed
         t = rand() % 10+ 1;       // random number 1-10
   
         cout << t << endl;

return 0;
}

2):
srand(time(0));                                             //依据系统时间设置随机数种子
float x = rand() * x / RAND_MAX;                          //返回1/x的概率

3):
srand(time(0));                                           //依据系统时间设置随机数种子
vector<int> v;                                            ////随机訪问数组类型,#include <vector>
random_shuffle(v.begin(), v.end());              //STL算法random_shuffle把容器类的元素顺序捣乱

下面源代码来自crafty19.3,最强的源代码开放的chess程序。凝视非常清楚,无需多言。
问:
1.Knuth的书中是怎么讲的?该书我无缘拜读。
2.static const unsigned long x[55],这里取55个随机数的理由是什么?
3.是否能比較全面地讲讲随机数产生的一些算法或理论,或推荐一些參考资料?
[code]

unsigned int Random32(void) {
   
    static const unsigned long x[55] = {
      1410651636UL, 3012776752UL, 3497475623UL, 2892145026UL, 1571949714UL,
      3253082284UL, 3489895018UL, 387949491UL, 2597396737UL, 1981903553UL,
      3160251843UL, 129444464UL, 1851443344UL, 4156445905UL, 224604922UL,
      1455067070UL, 3953493484UL, 1460937157UL, 2528362617UL, 317430674UL,
      3229354360UL, 117491133UL, 832845075UL, 1961600170UL, 1321557429UL,
      747750121UL, 545747446UL, 810476036UL, 503334515UL, 4088144633UL,
      2824216555UL, 3738252341UL, 3493754131UL, 3672533954UL, 29494241UL,
      1180928407UL, 4213624418UL, 33062851UL, 3221315737UL, 1145213552UL,
      2957984897UL, 4078668503UL, 2262661702UL, 65478801UL, 2527208841UL,
      1960622036UL, 315685891UL, 1196037864UL, 804614524UL, 1421733266UL,
      2017105031UL, 3882325900UL, 810735053UL, 384606609UL, 2393861397UL };
    static int init = 1;
    static unsigned long y[55];
    static int j, k;
    unsigned long ul;
 
    if (init)
    {
      int i;
   
      init = 0;
      for (i = 0; i < 55; i++) y[i] = x[i];
      j = 24 - 1;
      k = 55 - 1;
    }
 
    ul = (y[k] += y[j]);
    if (--j < 0) j = 55 - 1;
    if (--k < 0) k = 55 - 1;
    return((unsigned int)ul);
} [/code]

对于刚開始学习的人来说,仅仅需熟练掌握1)种使用方法,更深层次的随着水平的提升自然会有所领悟.

另:

一、C++中不能使用random()函数      random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。可改用C++下的rand函数来实现。      1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受參数,默认以1为种子(即起始值)。随机数生成器总是以同样的种子開始,所以形成的伪随机数列也同样,失去了随机意义。(但这样便于程序调试)
      2、C++中还有一函数srand(),能够指定不同的数(无符号整数变元)为种子。可是假设种子同样,伪随机数列也同样。一个办法是让用户输入种子,可是仍然不理想。
      3、比較理想的是用变化的数,比方时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++随机函数(VC program)
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std; 
#define MAX 100
int main(int argc, char* argv[])
{

//srand()函数产生一个以当前时间開始的随机种子.

//应该放在for等循环语句前面不然要非常长时间等待

srand( (unsigned)time( NULL ) );

   for (int i=0;i<10;i++)
   cout<<rand()%MAX<<endl;//MAX为最大值,其随机域为0~MAX-1
   return 0;
}
二、rand()的使用方法  
      rand()不须要參数,它会返回一个从0到最大随机数的随意整数,最大随机数的大小一般是固定的一个大整数。这样,假设你要产生0~10的10个整数,能够表达为:
  int N = rand() % 11;
      这样,N的值就是一个0~10的随机数,假设要产生1~10,则是这样:
  int N = 1 + rand() % 11;
  总结来说,能够表示为:
  a + rand() % n
      当中的a是起始值,n是整数的范围。   a + rand() % (b-a+1) 就表示 a~b之间的一个随机数若要0~1的小数,则能够先取得0~10的整数,然后均除以10就可以得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则须要先得到0~100的10个整数,然后均除以100,其他情况依
此类推。
      通常rand()产生的随机数在每次执行的时候都是与上一次同样的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,能够使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。
      如大家所说,还能够包括time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就能够保证每两次执行时能够得到不同的随机数序列(仅仅要两次执行的间隔超过1秒)。

转自:http://blog.sina.com.cn/s/blog_51409e8f01009hr7.html~type=v5_one&label=rela_nextarticle

C++中的随机数函数(,布布扣,bubuko.com

时间: 2024-10-07 08:54:34

C++中的随机数函数(的相关文章

理解与使用Javascript中的回调函数 -2

在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply()函数的,或者有一些简短的关于callback的使用示例. 函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用 Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串

Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random,ThreadLocalRandom 即:java.util.concurrent.ThreadLocalRandomSecureRandom即:java.security.SecureRandom Q:Random是不是线程安全的?A:Random是线程安全的,但是多线程下可能性能比较低.参考:http://docs.oracle.com

Mysql中常用的函数汇总

Mysql中常用的函数汇总: 一.数学函数abs(x) 返回x的绝对值bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)ceiling(x) 返回大于x的最小整数值exp(x) 返回值e(自然对数的底)的x次方floor(x) 返回小于x的最大整数值greatest(x1,x2,...,xn)返回集合中最大的值least(x1,x2,...,xn) 返回集合中最小的值ln(x) 返回x的自然对数log(x,y)返回x的以y为底的对数mod(x,y) 返回x/y的模(余数)pi(

T-SQL中的随机数

T-SQL中的随机数 SQL开发中会有生成随机数的需求,下面说几种常用的需求和解决办法(基于MS SQL),最后总结出通用的办法: 1.0-9间的随机整数,包括0和9本身: abs(checksum(newid()))%10 扩展从a-b间的随机整数(a,b本身也是整数): a+abs(checksum(newid()))%(b-a+1) 2.0-1间的随机实数: rand() --或是 rand(checksum(newid())) --推荐使用后一种. 由此扩展从a-b间的随机实数: a+r

SQL Server中的RAND函数的介绍和区间随机数值函数的实现

    工作中会遇到SQL Server模拟数据生成以及数值列值(如整型.日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数.鉴于此,本文将对SQL Server中随机数的使用简单做个总结 .   T-SQL 随机有关的三个函数          RAND([seed] 此函数生成从0到1之间随机 float 值(详细说明查看https://technet.microsoft.com/zh-cn/library/ms177610(v=sql.90).aspx). CHECKSUM

AWK指定范围随机数函数

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.rand 是awk内置的随机数函数但只能生成 0-1 之间的随机数且无法定义生成范围,为解决 AWK指定范围随机数 的问题,定义了下面的 irand 的随机数函数. cat infile | awk -F " " ' function irand(min, max){     max= max - min + 1;     num= rand() * 1000000000;     retur

MATLAB中的常用函数

MATLAB中的常用函数 1. 特殊变量与常数 主题词 意义 主题词 意义 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 NaN 非数 nargin 输入参数个数 nargout 输出参数的数目 pi 圆周率 nargoutchk 有效的输出参数数目 realmax 最大正浮点数 realmin 最小正浮点数 varargin   实际输入的参量 varargout 实际返回的参量     2.

matlab 全部的随机数函数

matlab 全部的随机数函数 (一)Matlab内部函数 a. 基本随机数 Matlab中有两个最基本生成随机数的函数. 1.rand() 生成(0,1)区间上均匀分布的随机变量.基本语法: rand([M,N,P ...]) 生成排列成M*N*P... 多维向量的随机数.如果只写M,则生成M*M矩阵:如果参数为[M,N]可以省略掉方括号.一些例子: rand(5,1) %生成5个随机数排列的列向量,一般用这种格式 rand(5) %生成5行5列的随机数矩阵 rand([5,4]) %生成一个

Javascript 随机数函数 学习之二:产生服从正态分布随机数

一.为什么需要服从正态分布的随机函数 一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实生活中更多的随机现象是符合正态分布的,例如20岁成年人的体重分布等. 假如我们在制作一个游戏,要随机设定许许多多 NPC 的身高,如果还用Math.random(),生成从140 到 220 之间的数字,就会发现每个身高段的人数是一样多的,这是比较无趣的,这样的世界也与我们习惯不同,现实应该是特别高