哪位高手知道rand()实现方法?

fanne 2003-12-12 10:07:22
c++中产生随机数可用:
#include <cstdlib>
.............
srand(int m);
int n=rand()%m;
............
不知rand(),srand()如何实现?
...全文
166 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cxjddd 2003-12-13
《The GNU C Library》里说的,大概如下:
公式:
Y = (a * X + c) mod m
a,c,m 都是常数

一种取值是:
a = 0x5DEECE66D = 25214903917
c = 0xb = 11
m = 2^48

用上面的公式可以这样写:
__int64 rand ()
{
static __int64 r = 0;
const __int64 a = 25214903917;
const __int64 c = 11;
const __int64 m = 1 << 48;
r = (r * a + c) % m;
return r;
}
  • 打赏
  • 举报
回复
raygtr 2003-12-13
#include < iostream.h >
#include < iomanip.h >
#include < stdlib.h >
#include < time.h >
void main()
{
const int arraySize =7;
int face,frequency[ arraySize ] ={0};
srand( time(NULL));
for(int roll= 1;roll <=6000; roll++)
++frequency[1+rand()%6];

cout<<"Face "<<setw(13) <<"Frequency"<<endl;
for(int facce =0; facce<arraySize; facce++)
cout<<facce<<endl<<frequency[facce]<<endl;






}
  • 打赏
  • 举报
回复
lyr311 2003-12-13
搞不懂这个问题,象其他软件产生服从某种分布(均匀分布,正态分布,β分布,χ2分布等等)的随机数又是怎么实现的呢?是根据均匀分布的随机数进行什么变换得来的么?
  • 打赏
  • 举报
回复
cpsoft 2003-12-13
在多任务操作系统里,你取两个相隔较远的time,它们的差值也许是个真随机数!
  • 打赏
  • 举报
回复
zming 2003-12-13
不依赖于硬件只有伪随机数。

不过,如果算法好的话,伪随机数的循环周期还是很长的。

我们以前产生伪随机数的方法是:本原多项式,大M序列。

  • 打赏
  • 举报
回复
smalltalk 2003-12-13

这是rand()和srand()在VC中的实现!

static long holdrand = 1L;

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
* Seeds the random number generator with the int given. Adapted from the
* BASIC random number generator.
*
*Entry:
* unsigned seed - seed to seed rand # generator with
*
*Exit:
* None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
unsigned int seed
)
{
holdrand = (long)seed;
}

/***
*int rand() - returns a random number
*
*Purpose:
* returns a pseudo-random number 0 through 32767.
*
*Entry:
* None.
*
*Exit:
* Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
void
)
{
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}
  • 打赏
  • 举报
回复
zhukeke 2003-12-12
真正的随机只能靠外加的硬件,在现有的无外在硬件的支持下是不可能的。因为计时/计数器总是与时间相关的。
  • 打赏
  • 举报
回复
fanne 2003-12-12
对,我的意思是自己编写rand,并且保证真正的随机而不是有的出现的
概率大,有的概率小。
  • 打赏
  • 举报
回复
cpsoft 2003-12-12
计算机里的随机数一般都是伪随机数,
大多都是找一个计算机里每时每刻都不同的数将其变化得来.所以大多是取系统时间.
但是老的编译系统,如QB好象一天里每次出现的随机基本相同.
至于变化的方法很多,基本上都是使其的随机性增加的.
我也是初学者,大家共同学习!
  • 打赏
  • 举报
回复
layman2008 2003-12-12
你的意思是自己编写rand和srand吗?

  • 打赏
  • 举报
回复
redhat_xu 2003-12-12
#include<iostream.h>
#include <stdlib.h>
void main()
{
int i;
double j;
randomize();//随机函数初始化
for( i = 0; i < 30;i++ )
{
j=(double)(rand()/(double)RAND_MAX); //求随机值
cout<<j<<endl;
}
}

有的随机函数初始化需要time.h这个头文件。
如srand(),参数为时间变量,一般为系统当前时间,这样产生的值更随机一些。
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.1w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2003-12-12 10:07
社区公告
暂无公告