专栏首页阿林前端开发攻城狮Hammersley序列的对比实现伪代码
原创

Hammersley序列的对比实现伪代码

Hammersley序列的对比实现伪代码

复制代码12345678910111213141516171819202122CPPdouble make_halton_sequence(int index, int base) {
    double f = 1, r = 0;
    while (index > 0) {
        f = f / base;
        r = r + f * (index % base);
        index = index / base;
    }
    return r * randpoint_scale;
}

void halton_random()
{
	// 此处讨论生成二维随机数,如要产生多维,base需要是不重复的质数即可
	// 三维:base 2 3 5
	for (uint i = 0u; i < max_num; ++i)
	{
		draw_points.emplace_back(make_halton_sequence(i, 2), make_halton_sequence(i, 3));
		// 三维
		draw_points.emplace_back(make_halton_sequence(i, 2), make_halton_sequence(i, 3)
		, make_halton_sequence(i, 5));
	}
}
  • Halton序列在底数较大的时候,样本个数会有很严重的correlation。所以需要采用Scrambling解决这个问题
  • RadicalInverse的实现的效率依赖于一个循环,将索引Index的数字左右颠倒。这一步骤可以通过一次将多个连续数字的左右颠倒连同Faure Scrambling预计算出来,存在一个查找表里。运行的时候直接将索引的多个数字提取出来,然后直接查表得到结果。下面给出一段以5作为底数的Halton序列实现 详细做法可参考:HALTON The Halton Quasi Monte Carlo (QMC) Sequence

与Hammersley序列的对比

Hammersley序列的介绍与实现可参考这篇:

  • 低差异序列 (low-discrepancy sequences)之Hammerysley在半球中采样点方法的介绍

Halton序列无需在生成随机数之前,知道需要生成随机点的个数,但是在用一些比较大的质数作为底数时,Halton序列的分布在点的数量不那么多的时候并不会均匀的分布,只有当点的数量接近底数的幂的时候分布才会逐渐均匀

效果对比

Halton序列比一般的伪随机数更加地分布均匀,因为此处是没有对Halton进行优化的,即没有Scrambling,可从另一幅图看到,Hammersley序列比未优化的Halton序列相对来说更加地均匀,但未优化的效果也可以说是比较不错的了

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Scrambled后的序列依然具有radical inversion的性质

    原文中陈述了很多具体的例子,而缺乏了一些Halton序列本身的说明,使用场景、以及与其他序列使用对比的差异,故在此处进行补充

    用户7108768
  • 序列比对(20)基序发现问题的算法及实现代码

    由于要遍历所有可能的起始位点,所以一种自然的想法是使用递归。但是为了配合后续的分支定界法,我们采用了树结构,并且进行DFS(深度优先搜索)。既然采用树结构,最简...

    一只羊
  • 蒙特卡洛算法及其实现

    从今天开始要研究Sampling Methods,主要是MCMC算法。本文是开篇文章,先来了解蒙特卡洛算法。 Contents    1. 蒙特卡洛介绍    ...

    Angel_Kitty
  • 序列比对(21)中间字符串问题的算法及实现代码

    《序列比对(20)基序发现问题的算法及实现代码》给出了基序问题的算法和实现代码。本文将介绍中间字符串问题的算法,并给出实现代码。

    一只羊
  • 排序算法对比,步骤,改进,java代码实现

    发现是时候总结一番算法,基本类型的增删改查的性能对比,集合的串并性能的特性,死记太傻了,所以还是写在代码里,NO BB,SHOW ME THE CODE!

    ydymz
  • R语言实现生物序列的降维比对

    系统发育树分析大家应该很熟悉,很多软件都可以实现可视化的操作。今天给大家介绍一个通过“SpacedWords Projection” 方法实现的氨基酸序列系统发...

    一粒沙
  • R语言实现基因序列的匹配和比对

    我们对字符串都很熟悉,那么面对大量的测序序列字符串,我们如何对其进行处理分析,获得最终的结果。在R语言中有学者专门针对字符串的处理开发了对应的包,命名为Bios...

    一粒沙
  • 总共4行代码使用fastxml.json实现Java对象的序列化和反序列化

    最后的jerry和another实例的比较会得到期望的false,这也是通过序列化/反序列化攻击单例模式实现的例子。

    Jerry Wang
  • R语言实现多序列比对(MSA)可视化

    其它的颜色我们就不一一试了。接下来我们看下,font=NULL,去掉背景之后的样子:

    一粒沙
  • PHP序列化的四种实现办法与横向对比

    序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序...

    砸漏
  • PHP序列化的四种实现方法与横向对比

    序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序...

    砸漏
  • 几行代码实现谷歌百度搜索对比

    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    用户1503405
  • 序列比对(14)viterbi算法和后验解码的比较

    前文《序列比对(十)viterbi算法求解最可能路径》介绍了用viterbi算法求解最可能路径:在符号序列已知而状态序列未知时,最可能路径是:

    一只羊
  • 「crudapi」零代码实现订单序列号Sequence

    本文通过产品编码和订单流水号介绍一下序列号(Sequence)在crudapi中的应用。

    crudapi
  • 计数器、滑动窗口、漏桶、令牌算法比较和伪代码实现

    计数器是限流里最简单的,简单来说,比如 我限制1分钟内 请求数最多为60个! 当此刻 2018-02-27 16:23:00 到 2018-02-27 16:2...

    用户2825413
  • 源码分析kryo对象序列化实现原理

    本文主要梳理Kryo序列化基本实现。重点剖析Kryo#writeClassAndObject、Kryo#readClassAndObject方法。

    丁威
  • Mybatis逆向工程的pojo实现序列化接口的代码

    这两天在学习一个分布式的项目--淘淘商城,使用了Alibaba的dubbo作为通信工具,zookeeper作为register,由于dubbo是基于socket...

    黑泽君
  • 入门 | 十分钟搞定Keras序列到序列学习(附代码实现)

    机器之心
  • 分离链接的散列散列代码实现

    散列 散列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在散列中的位置,类似于Python中的字典。关...

    月见樽

扫码关注云+社区

领取腾讯云代金券