注册 登录
编程论坛 C++教室

随机数的产生

无缘今生 发布于 2007-11-24 20:48, 2472 次点击
在网上搜索了N久,都是些大同小异的实现方法.要么有些根本就不行.

请各位来说说,究竟如何才能产生比较满意的随机数.
前提是: 不用与rand()类似的一些库函数.
12 回复
#2
VxWorks2007-11-24 22:08
取当前系统时间做随即数种子,把这个种子转换为合适的数据类型x,然后通过一个函数y=f(x)算出映射y,这个y就是随即数。

 Donald.E.Knuth的那本<<The Art of Computer Programming>>中有一章是随即数算法的讨论。

我以前不能用标准库时遇到过和你一样的问题。
#3
无缘今生2007-11-24 23:01
再请教楼上:取得系统时间做随机数种子的方法是不是这样:
            srand(time(NULL));
#4
VxWorks2007-11-25 09:33
我还以为你不能用标准库呢,既然可以何必要自己写rand函数?只要你把种子设置好了这个函数产生的伪随机数还是不错的。
程序代码:
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays 10 random integers.
//

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main( void )
{
   int i;
   
   // Seed the random-number generator with current time so that
   // the numbers will be different every time we run.
   //
   srand( (unsigned)time( NULL ) );

   // Display 10 numbers.
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );

  printf("\n");

  // Usually, you will want to generate a number in a specific range,
  // such as 0 to 100, like this:
  {
     int RANGE_MIN = 0;
     int RANGE_MAX = 100;
     for (i = 0;    i < 10; i++ )
      {
         int rand100 = (((double) rand() /
                         (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
         printf( "  %6d\n", rand100);
      }
  }
   getchar();
   return 0;
}
#5
无缘今生2007-11-26 11:59
这个函数不错,可以满足要求。
但是,如果我想自己另写一个,采用什么算法比较好呢?
在网上找的那些什么同余法等等所产生的结果都不是很理想。
#6
yuanhong2007-11-26 15:59
原帖由 [bold][underline]无缘今生[/underline][/bold] 于 2007-11-24 23:01 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1113281&ptid=188135][/url]
再请教楼上:取得系统时间做随机数种子的方法是不是这样:
            srand(time(NULL));

            srand(time(0))
#7
leeco2007-11-27 15:38
原帖由 [bold][underline]无缘今生[/underline][/bold] 于 2007-11-26 11:59 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1115079&ptid=188135][/url]
这个函数不错,可以满足要求。
但是,如果我想自己另写一个,采用什么算法比较好呢?
在网上找的那些什么同余法等等所产生的结果都不是很理想。 ...


你所谓的不理想是指什么。分布不理想?
#8
无缘今生2007-11-28 13:34
楼上说得对,所产生的各随机数的分布的确让人难以相信那是随机数.
给我的感觉就是:那只是经过变换的一组确定的数字!
个人愚见,请各位指正.
#9
忘记喧嚣2007-11-28 22:33
那你就 圆周率 随便取几为 就是随即数了
#10
StarWing832007-12-19 01:20
其实主要是开始的种子的选取和算法的选择~很早以前感兴趣研究过,不过没有深究~~
#11
diaoxue2007-12-20 00:19
随机算法
一般产生的是伪随机数
#12
HJin2007-12-20 09:41
there are many methods for generating pseudo-random numbers, such as Boost random number library.

The simplest may the Linear congruential generator.
#13
无缘今生2007-12-20 13:15
I am working on a system which has no Chinese input.

Could you tell me the name of the system that you are working on.
1