编程技巧干货笔记 【快速伪随机数生成】
2017-08-30 09:41
309 查看
游戏中自己实现一个伪随机数生成器在调试的时候会很方便
下面这个伪随机数生成方法是在"雷神之锤"的源码中看到的,记录下来,方便以后使用
首先有一个随机数种子,相同的种子将产生出相同的伪随机数列
快速生成一个整型伪随机数,里面比较神奇的数字就是 69069了
快速生成一个 [0, 1] 内的伪随机小数
这种随机数生成方法的散列性是不错的,足够一般游戏使用
在调试的时候可以设置一个常量作为随机数,方便问题的重现
在需要一个真正的随机源的时候可以使用当前系统时间或者其它途径
【关于生成一定范围内的随机数坑】
常用的生成[a, b]范围内随机数的方法 rand() % (b - a + 1) + a
这个做法除非 (b - a + 1) 可以整除 RAND_MAX, 否则不是所有值出现的概率都是相等的
一个简单的解决方法就是先将随机数映射到 [0, 1] 内再放缩致 [a, b] 内
【当前有效的随机数生成算法】
WELL 算法
马特塞特旋转算法
下面这个伪随机数生成方法是在"雷神之锤"的源码中看到的,记录下来,方便以后使用
首先有一个随机数种子,相同的种子将产生出相同的伪随机数列
int seed = 1; // 随机数种子 void q_srand(int s) { seed = s; }
快速生成一个整型伪随机数,里面比较神奇的数字就是 69069了
int q_rand(int *seed) { *seed = (*seed) * 69069 + 1; return *seed; }
快速生成一个 [0, 1] 内的伪随机小数
float q_random(int *seed) { return static_cast<float>(q_rand(seed) & 0xffff) / (float)0x10000; }
这种随机数生成方法的散列性是不错的,足够一般游戏使用
在调试的时候可以设置一个常量作为随机数,方便问题的重现
在需要一个真正的随机源的时候可以使用当前系统时间或者其它途径
【关于生成一定范围内的随机数坑】
常用的生成[a, b]范围内随机数的方法 rand() % (b - a + 1) + a
这个做法除非 (b - a + 1) 可以整除 RAND_MAX, 否则不是所有值出现的概率都是相等的
一个简单的解决方法就是先将随机数映射到 [0, 1] 内再放缩致 [a, b] 内
float v = static_cast<float>(rand()) / RAND_MAX; int randVal = static_cast<int>(v * (b - a + 1) + a);
【当前有效的随机数生成算法】
WELL 算法
马特塞特旋转算法
相关文章推荐
- 编程技巧干货笔记 开篇
- 编程技巧干货笔记 【Copy-On-Write】
- 编程技巧干货笔记 【关于内联函数】
- 编程技巧干货笔记 【数组范围界定】
- 编程技巧干货笔记 【关于一些运算符的效率】
- 编程技巧干货笔记 【Vector / Set OR Map ?】
- 网站制作笔记-bootstrap可视化布局,表单生成工具,快速制作网页原型
- Python核心编程笔记-第2章:快速入门
- 微信公众平台服务号开发者模式自定义菜单快速生成技巧
- Java编程中如何在一个数值范围内生成一个伪随机数
- 编程技巧 用Asp.net动态生成html页面
- linux系统编程快速定位头文件的技巧之强大的grep命令
- cocos2d-x 菜鸟学习笔记九(引用plist快速生成动画精灵)
- Python编程技巧笔记(转)
- 学习笔记2--用Sass快速生成颜色表
- 数据结构编程笔记二十:第七章 图 最小生成树算法的实现
- 编程技巧之嵌入式C语言完全学习笔记及案例[图]
- JAVA学习笔记(一)-基本编程技巧
- 编程技巧学习笔记之对象池
- STL源码剖析之迭代器概念与traits编程技巧--学习笔记