求征一伪随机序列算法
我想要这样一个算法:通过输入一个keyword(比如一个数字)产生可控数目的随机序列,并且每次只要keyword一样,则生成的序列也一样。vc中有这样的函数吗? 问题点数:50、回复次数:13Top
1 楼flysundy(毛毛虫)回复于 2002-12-26 22:38:26 得分 0
有人知道吗?或者提供一点意见也好啊Top
2 楼mostneed(黙黙)回复于 2002-12-26 22:46:26 得分 3
c的随即函数就是要下种子的啊,如果种子一样,每次得到的都一样。Top
3 楼lanhuaiyu(激情万岁!)回复于 2002-12-27 07:59:54 得分 2
mostneed(现在是兼职称畜员)说的队,一般书上都有此类程序Top
4 楼flysundy(毛毛虫)回复于 2002-12-27 09:26:26 得分 0
你们说的是每次只能生成一个的吧?那如果需要很多个不同的随机数的话,是不是要很多个种子呢?我想要一个算法只要一个种子就行Top
5 楼tony1978(突击召唤师)回复于 2002-12-27 09:31:55 得分 2
你下一次种子,然后不停获得随机数,就得到一个固定的数列。
Top
6 楼shines(郭子)回复于 2002-12-28 14:54:18 得分 5
MSDN说明:
srand
Sets a random starting point.
void srand( unsigned int seed );
只要
使用(以当前时间为种子,基本实现随机的随机数):
srand( (unsigned)time( NULL ) );
要实现你的想法,只需:
unsigned int seed;
seed=1234;
srand( seed );
你指定一次seed,在没有种第二次种子之前,这个序列是相同的不变的。
使用这个函数需要:
#include <stdlib.h>
Top
7 楼flysundy(毛毛虫)回复于 2002-12-29 13:00:31 得分 0
可是我想要的是一次定种子,而生成的序列是不相同的,我觉得这需要一个专门的算法才能解决,一个函数是不够的。Top
8 楼shines(郭子)回复于 2002-12-30 01:38:14 得分 5
真是蠢到了极点!!
srand( (unsigned)time( NULL ) );
种一次种子,生成的序列不相同!
我想要这样一个算法:通过输入一个keyword(比如一个数字)产生可控数目的随机序列,并且每次只要keyword一样,则生成的序列也一样。vc中有这样的函数吗?
可是我想要的是一次定种子,而生成的序列是不相同的,我觉得这需要一个专门的算法才能解决,一个函数是不够的。
你说的前后矛不矛盾啊??!!Top
9 楼shines(郭子)回复于 2002-12-30 01:44:50 得分 8
你要自己写也可以:
int Random(const int& n)
{
static int seed=0,c1=29,c2=217,c3=1024;
if (seed==0)seed=(UINT)::GetTickCount();
seed=(seed*c1+c2)%c3;
return seed*n/c3;
}Top
10 楼pick()回复于 2003-01-01 19:34:35 得分 5
设a 为一个无理数(比如a=sin(1.25))
那么 0<t=n*a-[a*n]<1 ([n*a]为n*a的整数部分)
则t是(0,1)之间的随机数Top
11 楼duwenyong(啸海)回复于 2003-01-02 19:49:08 得分 20
/*随机数发生程序
如果还不够快,或者还需要其他属性的随机数,就采用查表
方法.
还记得我以前提的方案吗?
*/
#include "windows.h"
#include "stdio.h"
#include <memory.h>
#define DWORD unsigned long
// 两个小m序列系数
DWORD MCoef_32[2]={0xE7BD2160,0xDA3A2A9C};
// dwMset: 随机发生器所使用的小m序列
// dwKey: 随机数种子
// nNumber: 产生的随机序列长度(以DWORD为单位)
// pdwRandom: 指向随机数存储空间的指针
// return value: 运算完成之后随机数发生器的状态
DWORD m_Seq_32_m(DWORD dwMset,DWORD dwKey,int nNumber, DWORD * pdwRandom)
{
_asm
{
CLD
MOV EDI,pdwRandom;
MOV ECX,nNumber;
MOV ESI,dwMset;
MOV EAX,dwKey;
ALIGN 4
LOOP_CIRCLE1:
PUSH ECX
MOV ECX,32
LOOP_CIRCLE2:
MOV EBX,EAX;
SHL EAX,1
AND EBX,ESI; //select the bit for xor
MOV EDX,EBX;
BSWAP EBX;
XOR BX,DX;
XOR BH,BL; // because P only judge one byte
// so must XOR to judge the p of whole word
JP NEXT //jp equals the xor
INC EAX
NEXT: DEC ecx
JNZ LOOP_CIRCLE2
POP ECX
STOSD
DEC ECX
JNZ LOOP_CIRCLE1
MOV dwKey,EAX
}
return dwKey;
}
// 产生长度为nLength字节的随机数
// Buffer: 指向随机数存放区域的指针
// nLength: 产生随机数数量
void RandomGenerator(void * Buffer, int nLength)
{
DWORD A;
BYTE B[4];
_asm
{
_emit 0x0f
_emit 0x31
MOV A,EAX
}
A=m_Seq_32_m(MCoef_32[0],A,nLength/4,(DWORD *)Buffer);
if(nLength%4!=0)
{
m_Seq_32_m(MCoef_32[0],A,1,(DWORD *)B);
memcpy(Buffer+(nLength/4)*4,B,nLength%4);
}
return;
}
void main()
{
float a[10];
LARGE_INTEGER start,end;
QueryPerformanceCounter(&start);
for(int i=0;i<10;i++)
{
RandomGenerator(&a[i],1);
printf("%6f\n",a[i]);
}
QueryPerformanceCounter(&end);
printf("time:%6f ",(double)(end.QuadPart-start.QuadPart)/1193180);
}
Top
12 楼duwenyong(啸海)回复于 2003-01-02 19:49:22 得分 0
#include "stdlib.h"
#include "math.h"
#define RAND_TABLE_SIZE 101
#define RAND_INITIAL_SEED 3030303L
static float rand_table[RAND_TABLE_SIZE];
static float last_rand;
//选择随机种子
void rwfRandSrand(unsigned long iseed)
{
int i;
srand(iseed);
for(i=0;i<RAND_TABLE_SIZE;i++)
rand_table[i]=rand()/(RAND_MAX+1.0);
last_rand=rand()/(RAND_MAX+1.0);
}
//产生不相关,均匀分布的随机数系列
float rwfRand()
{
int index;
index=(int)(RAND_TABLE_SIZE*last_rand);
last_rand=rand_table[index];
rand_table[index]=rand()/(RAND_MAX+1.0);
return last_rand;
}
//产生正态分布随机数系列
float rwfRandGauss(void)
{
static int need_newvars=1;
static float factor,v1,v2;
float result;
float r;
if(need_newvars)
{
r=1.1;
while(r>=1.0||r==0)
{
v1=2.0*rwfRand()-1.0;
v2=2.0*rwfRand()-1.0;
r=v1*v1+v2*v2;
}
need_newvars=0;
factor=sqrt(-2.0*log(r)/r);
result=v1*factor;
}
else
{
need_newvars=1;
result=v2*factor;
}
return result;
}
main()
{
int i;
rwfRandSrand(RAND_INITIAL_SEED);
for(i=0;i<10;i++)
printf("%6f\n", rwfRandGauss());
}Top
13 楼duwenyong(啸海)回复于 2003-01-05 19:19:10 得分 0
#include "stdlib.h"
#include "math.h"
#define RAND_TABLE_SIZE 101
#define RAND_INITIAL_SEED 3030303L
static float rand_table[RAND_TABLE_SIZE];
static float last_rand;
//选择随机种子
void rwfRandSrand(unsigned long iseed)
{
int i;
srand(iseed);
for(i=0;i<RAND_TABLE_SIZE;i++)
rand_table[i]=rand()/(RAND_MAX+1.0);
last_rand=rand()/(RAND_MAX+1.0);
}
//产生不相关,均匀分布的随机数系列
float rwfRand()
{
int index;
index=(int)(RAND_TABLE_SIZE*last_rand);
last_rand=rand_table[index];
rand_table[index]=rand()/(RAND_MAX+1.0);
return last_rand;
}
//产生正态分布随机数系列
float rwfRandGauss(void)
{
static int need_newvars=1;
static float factor,v1,v2;
float result;
float r;
if(need_newvars)
{
r=1.1;
while(r>=1.0||r==0)
{
v1=2.0*rwfRand()-1.0;
v2=2.0*rwfRand()-1.0;
r=v1*v1+v2*v2;
}
need_newvars=0;
factor=sqrt(-2.0*log(r)/r);
result=v1*factor;
}
else
{
need_newvars=1;
result=v2*factor;
}
return result;
}
main()
{
int i;
rwfRandSrand(RAND_INITIAL_SEED);
for(i=0;i<10;i++)
printf("%6f\n", rwfRandGauss());
}Top




