CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

求征一伪随机序列算法

楼主flysundy(毛毛虫)2002-12-26 21:38:07 在 VC/MFC / 图形处理/算法 提问

我想要这样一个算法:通过输入一个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

相关问题

  • 求随机序列生成算法!
  • [求教]得到非伪随机数的算法
  • 随机算法的问题
  • 求序列号加密算法!
  • 求生成随机数的算法
  • 画随机块——算法研究
  • 求随机数的算法怎么算?
  • 求助随机算法,thanks all.bow
  • 随机数的算法求解
  • 随机数的算法求解

关键词

  • 算法
  • 函数
  • 序列
  • 随机数
  • 种子
  • dwkey
  • 随机
  • rwfrand
  • seed
  • 生成

得分解答快速导航

  • 帖主:flysundy
  • mostneed
  • lanhuaiyu
  • tony1978
  • shines
  • shines
  • shines
  • pick
  • duwenyong

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo