当前位置:首页 > > 充电吧
[导读]多样化是生活的一大乐趣,而计算机却似乎完全是可预见的,因此显得较死板,随机数为计算机程序注入了不可预见的东西,因此可以让计算机更好地模拟外部事件。比如游戏,图形显示,计算机仿真,随机数增加了许多的乐趣

多样化是生活的一大乐趣,而计算机却似乎完全是可预见的,因此显得较死板,随机数为计算机程序注入了不可预见的东西,因此可以让计算机更好地模拟外部事件。比如游戏,图形显示,计算机仿真,随机数增加了许多的乐趣,而且当计算机程序重复运行时,不会表现出跟它模仿的自然系统有什么不同之处。


我们打算设计一个class Random, 它的成员函数生成和返回各种各样的随机数。
将要生成随机数的思想是,从一个数出发,对它进行一系列的算术运算,产生一个与开始那个数没有明显的关系的一个数。因此通过这种方法产生的数实际上一点也不随机,因为每一个数都依赖于它之前的一个数,而且这种依赖是固定的。我们应该更确切地叫它伪随机数(pseudorandom)。那个开始的数叫做随机种子(seed).
如果程序每次都从同一个种子开始运行,那么得到的整个伪随机数序列将会是完全一样的。因此我们可以产生任意已经得到过的实验结果。然而,假如客户希望随机数不仅是不可预测(unpredicable),而且还要不可重复生成的(unproducible)。因此我们应该提供一个根据现在的时间(精确到秒)来产生随机种子。因为程序每次运行的时刻很可能是不同的,这种初始化的方式会使客户程序每一次运行产生不同的行为。
我们打算为class Random提供一个构造函数,用一个参数bool pseudo来提供两种初始化随机种子的方式。当pseudo==true, 将用预定义的种子来产生随机数,反之,当pseud==false, 我们将产生unproducible的随机数。这种情况下,客户也无需特别地去初始化随机种子,程序会自动根据当前时间来初始化之。

源代码
//使用类应包括下列头文件

#include

class Random ...{
public:
   Random(bool pseudo = true);         // 构造函数
   double random_real();                // 产生0~1之间的实数
   int random_integer(int low, int high);  // 产生low ~~ high 之间的整形随机数
   int poisson(double mean);            // 泊松分布
 private:
   int reseed();                        //  Re-randomize the seed.
   int seed,
       multiplier, add_on;               //  constants for use in arithmetic operations
};



/*
核心函数是下面这个更新随机种子的reseed函数,给其他函数调用来产生随机化行为。
*/


int Random::reseed()
/**//*
Post: The seed is replaced by a pseudorandom successor.
*/
...{
   seed = seed * multiplier + add_on;
   return seed;
}



/* 常量multiplier和add_on保存在类得数据成员中,它们不应该随便选择,应该谨慎选择以保证结果的随机性,使其能多次变换。例如下面构造函数的值在16位机中表现得很好
*/

Random::Random(bool pseudo)
/**//*
Post: The values of seed, add_on, and multiplier are
      initialized.  The seed is initialized randomly only if pseudo == false.
*/
...{
   if (pseudo) seed = 1;
   else seed = time(NULL) % INT_MAX;
   multiplier = 2743;
   add_on = 5923;
}



/*
为了产生不可测的种子,我们用到了函数time(),它是包含在time.h头文件中,它计算从1970年开始流逝过的时间,单位是秒。INT_MAX是int型变量的最大值
*/

double Random::random_real()
/**//*
Post: A random real number between 0 and 1 is returned.
*/
...{
   double max = INT_MAX + 1.0;
   double temp = reseed();
   if (temp < 0) temp = temp + max;
   return temp / max;
}


/*
下面这个函数是产生的随机数形式是整形数。实际上,我们说随机整数是不准确的,因为整形数是无限的,而计算机表示的数是有限的。因此一个真正的随机数是计算机表示的数中的一个的概率是0。 而我们只考虑在low ~ high 之间的整数。
*/

int Random::random_integer(int low, int high)
/**//*
Post: A random integer between low and high (inclusive) is returned.
*/
...{
   if (low > high) return random_integer(high, low);
   else return ((int) ((high - low + 1) * random_real())) + low;
}



/*
泊松分布(Poisson distribution)
我们从称一个正实数为随机数的期望值(expected value)开始,如果一个非负整数序列满足期望值为v的泊松分布,那么足够长的子序列的平均值【mean(average) value】将趋近于v
例如期望值为1.5,我们可能读入一个序列: 1, 0, 2, 2, 1, 1, 3, 0, 1, 2, 0, 0, 2, 1, 3, 4, 2, 3, 1, 1, ....如果你计算子序列的平均值的话,你会发现有时小于1.5,有时大于,但慢慢地,它总的趋势会是1.5。
下面这个函数产生平均值为mean的泊松分布.  理论推导与证明省略。
*/

int Random::poisson(double mean)
/**//*
Post: A random integer, reflecting a Poisson distribution
      with parameter mean, is returned.
*/
...{
   double limit = exp(-mean);
   double product = random_real();
   int count = 0;
   while (product > limit) ...{
      count++;
      product *= random_real();
   }
   return count;
}



/*************************************************************************/


C/C++头文件

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭