非“伪”随机数的生成

转载 2006年05月16日 21:57:00
非“伪”随机数的生成

作者: Jerry Cat
时间: 2006/05/16
链接: 
http://www.cppblog.com/jerysun0818/archive/2006/05/16/7232.html

问题的来由 - "随机取m个数(在1到n的范围之内),(m <= n),要求m个数没有重复。有没有
什么好的算法,时间复杂度和空间复杂度都很好"

----------------------------------------------------------------
方案一:
取随机数可以用C++标准的rand,至于M个不重复,你可以用std::set来解决,把取道的随机数
插入到set里面,set的size() == m就可以了, 具体可以这样:

#include <set>
#include <stdlib.h>

int main()
{
   std::set<int> s;
   while(1)
   {
      int r = rand() % n;
      s.insert(r);
      if(s.size() == m)
      {
         break;
      }
   }
}

 由于set底层实现是红黑树,插入复杂度是对数级的^_^

----------------------------------------------------------------
方案二:
#include <iostream>
#include <cstdlib>      //用于rand()和srand()函数
#include <ctime>        //设置不同的随机数

using namespace std;

int main (){
    srand( time( 0 ) );    //调用不重复的随机数函数
    unsigned i;
    for ( int n = 0; n++ < 10; )
    {
        i = rand() ;        //对i 赋系统的随机数
        cout << " The NO." << n << "is : " << i << endl;
    }

    return 0;
}

1. C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX
   必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。

   随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同。失去了随机意义。

2. C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪
   随机数列也相同。--一个办法是让用户输入种子,但是仍然不理想。

3. 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。
   在 头文件ctime中时间库包含time函数,它可以返回一个表示时间、日期、月和年的数值使用如
   下调用可将该值设为rand的种子
   srand(static_cast<unsigned>(time(static_cast<time_t*>(NULL))));

4. 但, srand()并不是说使随机数都不一样,它只是使取随机数的种子随着时间而改变:)
   So, 还是方案一好!

伪随机数算法

伪随机数概念在我大学一年级接触C语言基础的时候就听说过,并熟练掌握C语言中rand()函数的使用方法。不过,当时我对伪随机数的认识基本也就停留在百度百科那种小白水平,最多就知道老师说我们用的随机数是假...
  • dukai392
  • dukai392
  • 2017年05月03日 21:46
  • 759

java 伪随机数安全性

真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。这样的随机数发生器叫做物理性随机数发生器,虽然很可靠,但是使用计算机很难实现,它们的缺点是技术要求比较高。在实...
  • qilixiang012
  • qilixiang012
  • 2015年08月01日 18:10
  • 1439

rand()函数产生的随机数为什么是伪随机数?

     伪随机数生成器将作为“种子”的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一直滚下去。伪随机数生成器的结果仅仅是不可预测。由伪随机数生成器返回的每一个值完全由它返回的前一个值所...
  • dfman1978
  • dfman1978
  • 2008年04月26日 20:08
  • 2117

产生伪随机数两种常用算法

我们讲的随机数其实暗指伪随机数。不少朋友可能想到C语言的rand(),可惜这个函数产生的随机数随机性非常差,而且速度很慢,相信几乎不能胜任一般的应用。 古老的LCG(linear congruent...
  • mergerly
  • mergerly
  • 2015年06月24日 11:29
  • 9847

matlab中的伪随机数原理

要说matlab的随机函数,就得先说说伪随机数。不过我也只能从matlab 应用的角度,从使用时的概念角度讲讲,梳理一下自己粗浅的理解。至于数理方面的,就没认真看过。真正的随机数是得通过现实世界中随机...
  • yuan1164345228
  • yuan1164345228
  • 2013年10月05日 09:08
  • 2701

伪随机数生成算法及性能检验

什么叫伪随机数         在一些问题中,比如计算机仿真和模拟、密码学等应用中,需要产生一个随机数数列来解决问题。         随机数数列分为真随机数数列和伪随机数数列。真随机数数列是完全不可...
  • johnhany
  • johnhany
  • 2012年10月24日 14:10
  • 6191

非重复随机序列生成算法-交换法

【算法3】 “思路2”的基本思想是:利用随机数的生成特点,将已经生成的数值,排除在随机区间之外,这样就可以确保下次生成的随机数一定是新的。具体来说,我们可以这样做: 首先,建立一个长度为N的数组a...
  • xmlife
  • xmlife
  • 2016年05月13日 17:13
  • 757

JAVA中三种随机数产生

转载: 关于Java中的Random()函数 今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做...
  • u012940983
  • u012940983
  • 2014年07月27日 10:50
  • 435

随机数发生器设计原理及实现

 随机数发生器设计原理及实现作者:不赖猴  内核编程和密码学群:20264887 随机数是密码学算法的基础,是现代加密体系中最重要的部分之一。几乎所有的密码学算法都需要使用随机数。那么是否真的存在真正...
  • a00553344
  • a00553344
  • 2009年03月11日 00:02
  • 13020

java伪随机数

首先,Math中的random方法其实是Random的nextDouble方法。 同余法(Congruential method)是很常用的一种随机数生成方法,在很多编程语言中有应用,最明显的就是ja...
  • aaaaaaadsfsdgsdfh
  • aaaaaaadsfsdgsdfh
  • 2016年06月19日 17:24
  • 415
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非“伪”随机数的生成
举报原因:
原因补充:

(最多只允许输入30个字)