首页 > 编程知识 正文

1到10随机数生成算法,随机数生成公式

时间:2023-05-04 10:28:59 阅读:107248 作者:187

经典算法:随机数生成0 .引言1 .问题描述2 .解法1 .算法思路2 .代码实现3 .解法21 .算法思路2 .代码实现3 .算法分析4 .总结0 .引言tkinter库的那个blob 其实并不简单。 而且,因为一开始找不到可靠的官方文档,所以我一个组件的APP也没有写,所以不得不去看源代码。 然后,我自己试着写了代码,累坏了。

啊,所以,这里休息一下,再写篇小文章休息一下。 劳逸结合了。

因此,现在我们来看看另一个经典的算法问题:随机数生成问题。

1 .提问描述随机数生成这个经典算法的问题我想大多数人都知道,尤其是对leetcode有过打磨和面试的经验,就是给它一个随机数生成器,生成另一个随机数范围。

一个典型的例子是使用rand7生成rand10。

因此,这里讨论rand7产生rand10的示例,考察关于rand10的实现构想,并且将它扩展到一定程度。

2 .解法1 .从算法考虑很明显的是,使用较宽范围的随机数生成器生成较窄范围的随机数生成器是非常简单的。 例如,rand7)作成rand5 )时,可以使用以下方法。

def rand5 ) : while True: seed=rand7) if seed=5: return seed显然以这种方式完成了从1到5的随机数发生器,但是当然效率稍微降低,对于每个随机数的生成

那么,对于小学生生成大问题,实际上也可以分解成同样生成大的小问题来尝试解决。

一个简单的概念是,可以使用10=2510=2(因为times 510=25,所以rand7) )构建两个rand5 )生成器,并将其合并到一个rand10 )生成器中。

2 .代码实现如下所示:

def rand2(: while true : seed=rand7) if seed!=7:返回种子! defrand10(:return5*(rand2)-1 ) rand5 ) (此处为rand5 ) )进行了说明,但不再赘述。

3 .算法分析表明,总体而言,每次生成随机数时需要调用的rand7()的预期次数为7/67/52.577/67/5 ) simeq2.57/67/52.57。

但是,上述算法的限制也是明显的,目的范围需要因式分解成为小数2个的积,否则无法直接抄写上述算法,例如rand11 (),无法通过分解来求解。

但是,这个问题也不是不能解决,只要稍微调整一下与上述相同的想法,我们就能解决。

3 .解法21 .从算法思路可以看出,上述算法中,最核心的地方是把问题从小问题转换成大问题。

在具体实现方式中,上述思路采用分解较大的模型,通过因式分解的方式将目标范围分割为几个概率相同、目前随机数生成能够涵盖的子范围进行求解。

但是,上述方法限制了分割过程必须是等概率分割的几个子范围,即必须是因子可分解的,但是如果对象范围是素数,或者因子中存在比当前随机数生成器大的数量,则上述思想是无效的

然而,可以通过颠倒上述划分思路,均匀地扩大当前随机数生成器以复盖目标范围,而不是缩小目标范围。

所谓扩大方式,就是通过k进制,扩大到k倍。 这样,就可以等概率地覆盖新范围内的所有值。

2 .代码实现如下所示:

def rand 10 (: while true : seed=(rand7)-1 ) * 7 rand7) ifseed=40:returnseed(1)3.与算法分析类似,上述算法

可以看出,这样我们就可以将问题不受限制地扩展到任意情况。

4 .综上,我们给出了经典算法问题——随机数生成问题的解答,并对其进行了一定的推广,推广到了任意两个随机数相互变换的问题。 具体来说,可以分解为大生成小及小生生成大的问题。

其中,对于大生成小的我们没有详细的讨论。 因为事实上,这还很明显。

另外,对于从小到大的问题,其核心处理思想实际上也是从大到小的变换,具体给出了目标范围的分解和现有生成范围的扩展这两种一般的实现方法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。