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

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


我们打算设计一个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++头文件

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

在本文中,我们将重点讨论在不可信环境中使用集体随机数生成方案的解决方案及其实际应用。简而言之,如何以及为什么在区块链中使用随机数,以及如何区分“好的”和“坏的”随机数。长期以来,密码学家一直在研

关键字: 区块链 区块链智能合约 随机数

本文在Randao实现的基础上,对一种新型RNG(随机数生成器)进行了简短的思想实验。Randao是一个DAO(分去中心化自治组织),它使用提交和显示方案来生成随机数。Randao的ZKRand

关键字: 比特币 随机数

BCH开发者awemany发布了一篇白皮书——《Storm——Using weak proof-of-work for instant confirmations on Bitcoin Cash

关键字: 比特币 数据结构 随机数 NBA

2019年8月30日,BCH开发者awemany发布了一篇白皮书——《Storm——Using weak proof-of-work for instant confirmations on B

关键字: 比特币 数据结构 随机数 NBA

上周的分享中,最后我们讲到了比特币是如何生成的。我们现在知道这里有一个叫做挖矿的过程。这是一个通过比特币特定算法不断产生新的正确的Block并延续Block Chain的过程。我们都知道区块链之

关键字: 区块链 比特币 随机数 字符串

踏入区块链世界后,我们经常听到的话就是“私钥如何如何重要”、“助记词如何如何重要”。..那么助记词和私钥到底是啥东西啊。.. 他俩为啥这么重要?到底谁又更重要?助记词和私钥之间

关键字: 区块链 比特币 随机数 COM

我们今天发表的一篇短论文介绍了 NEAR 协议所采用的随机信标。佐餐食用的本博文将着重讨论随机性的重要意义、实现难度以及其它协议的实现路径。 包括 NEAR 在内的诸多新型区块链协议都高

关键字: 区块链 随机数 节点 AN

好久没有跟大家聊聊算法方面的新研究了。理由当然不是学术领域没有新闻,毕竟顶会们收到的论文也是盆满钵满。但总体而言,说深度学习的理论研究一直在瓶颈期徘徊,想必也少有人会反对。 深度学习在应

关键字: AI 神经网络 敏感信息 随机数

9月14日,一款名为“EOSPlay”的 DApp 游戏遭遇了新型随机数攻击,一共损失了数万个 EOS。 或许很多人对「随机数攻击」这个词已经司空见惯了,因为在 DApp 遭遇黑客攻击的

关键字: 随机数 APP 黑客 伪随机数

链茶访是链茶馆开辟的区块链项目报道专栏,每周会对一个项目团队进行专访,链茶馆将挖掘不同项目的闪光点,讲述区块链开发者的创业故事,为各位区块链同侪提供最新的项目资讯与行业动向。 低TPS的

关键字: HARMONY 节点 POS 随机数
关闭
关闭