如何用一个1-8随机数生成器制作一个1-7随机数生成器?
从信息的角度来说,我们每次使用rand8(),获得的信息量都是3bit,或者说8种状态中的一种,那么n次的状态总量是8的n次方,或者说3n bit。以这样的一个空间,大概没有什么优雅的方案可以均匀的映射到一个每次都是7种状态的空间的。
如果我们将信息视作一进制,那么信息利用方式就只能对7取余数,则可以完全的利用所有的信息。简而言之,算法如下:
int rand7()
{
static int sum;
sum+=rand8();
if(sum>7)sum-=7;
return (sum%7 + 1);
}
此种算法有知友验证了从概率来说,7个数字产生概率都是相同的,但是数字之间的独立性却会有很大问题。
这个简单来说,***设当前sum=0,那么下次rand7返回值中,1会是2/8,其他是1/8。数据的独立性会有问题。但是每个数字的概率是相同的——其实如果你依次返回1-7,概率也是相同的,但显然这不能算是啥随机数。
int rand7()
{
int temp=rand8();
if(temp==8)return rand7();
else return temp;
}
这个很好理解,如果等于8则再取一次。但是理论上存在一长串8,导致效率低下,并且原理上是可能会有无限个连续的8出现以至于没有结果。
所以我们可以结合上面两种方案:
int rand7()
{
static int sum;
int temp=rand8();
sum+=rand8();
if(sum>7)sum-=7;
if(temp==8)return (sum%7 + 1);
else return temp;
}
这个方法是,一方面记录总和,如果rand8返回的是8,那利用sum对7取余数来得到随机值。这个方案的随机性我还没去验证,不过至少可以避免上一种方法的极端情况,但是还是牺牲了随机性的。
更高级的解法大概是要等数学专业的人来做解答了,大概这应该可以对应到数论或者某个数学现成的猜想或者命题。
如果你观察一下,会发现存在“if(之前的情况)输出现在的数字”这种语句的,几乎不可能独立,因为if本来就是一种关联。同样,求和为什么用static?static本身就意味着和之前的数据有关系,所以也是简单就能判断数据之间独立性是不完全满足随机数的要求的。
花藤体在线生成器如何制作花藤体文字?
打开浏览器找到【花藤体在线生成器】,点击进入【花藤体在线生成器】。
在【花藤体在线生成器】中输入你准备制作的文字。
点击下边的【个性文字定制】或者【魔法字符单个】,即可看到生成的花藤体字体。【魔法字符单个】是单个花藤字体符号,大家可以按照需要自行组合,生成自己专属的花藤体文字。比如:【௸༊哥ོ꧔ꦿდ客❦ৡ࿐ོ꧔ꦿ】,这个花藤体文字组合了很多种魔法字符,大家可以自由组合。