算法:线性同余法(LCG,Linear Congruential Generator)

1. 线性同余法(LCG)是什么?

线性同余法(LCG,Linear Congruential Generator) 是一种最简单、最常见的伪随机数生成算法。它使用一个递推公式,通过线性变换生成一系列的伪随机数。

LCG 的特点:

  • 计算简单,适合快速生成伪随机数
  • 适用于硬件和软件环境
  • 生成的随机数序列具有周期性(如果参数选择不当,周期可能较短)

2. LCG 的数学公式

LCG 通过以下递推公式生成随机数:

3. 线性同余法的示例

(1) C++ 实现 LCG

#include <iostream>class LCG {
private:uint64_t state;   // 当前随机数const uint64_t a = 1664525;   // 乘数const uint64_t c = 1013904223; // 增量const uint64_t m = 1ULL << 32; // 2^32, 典型的取值public:LCG(uint64_t seed) : state(seed) {}// 生成下一个随机数uint32_t next() {state = (a * state + c) % m;return (uint32_t)state; }// 生成[0,1)范围的浮点数double nextDouble() {return (double)next() / m;}
};int main() {LCG rng(12345); // 以 12345 作为种子for (int i = 0; i < 10; i++) {std::cout << rng.next() << std::endl;}return 0;
}

输出示例:

3346282858
2428863037
2433242068
...

(数值会根据种子不同而不同)

(2)opencv的实现

state = (uint64)(unsigned)state* /*CV_RNG_COEFF*/ 4164903690U + (unsigned)(state >> 32);
  • state:这是 RNG 类的一个成员变量,用于保存随机数生成器的当前状态。它是一个 64 位无符号整数(uint64 类型)。
  • (uint64)(unsigned)state:首先将 state 强制转换为 unsigned 类型(通常是 32 位无符号整数),然后再将其转换为 uint64 类型。这样做的目的是只取 state 的低 32 位进行后续计算。
  • 4164903690U:这是一个无符号整数常量,可能是作为随机数生成算法中的一个系数(注释中的 CV_RNG_COEFF 也暗示了这一点)。通过将 state 的低 32 位乘以这个系数,可以改变 state 的值,从而引入随机性。
  • (unsigned)(state >> 32):将 state 右移 32 位,即取 state 的高 32 位,然后将其转换为 unsigned 类型。这一步操作可以将 state 的高 32 位与低 32 位经过系数乘法后的结果相加。
  • 最后将计算结果赋值给 state,更新随机数生成器的状态。

在这段代码中:

  • X_n 相当于 state 的当前值。
  • a 相当于系数 4164903690U
  • c 相当于 (unsigned)(state >> 32)
  • m 是 uint64 类型的最大值,因为 state 是 uint64 类型,计算结果会自动进行模运算(溢出处理)。

通过不断更新 state 的值,并返回其低 32 位作为随机数,就可以生成一系列看似随机的无符号整数。但需要注意的是,LCG 生成的随机数是伪随机的,即它们是通过确定性的算法生成的,在特定条件下可能会出现重复的序列。

4. 线性同余法的周期性

5. 常见的参数选择

为了保证长周期和较好的随机性,不同系统有推荐的参数:

OpenCV RNG 采用的是 Numerical Recipes 参数

state = (1664525 * state + 1013904223) % (1ULL << 32);

6. LCG 的优缺点

✅ 优点

  • 计算简单(只用加法、乘法和取模)
  • 速度快
  • 适用于硬件实现

❌ 缺点

  • 随机性较差,不适合密码学
  • 低维分布性不好(会在高维空间形成结构)
  • 周期有限(如果参数选择不好,可能周期很短)

7. 更好的随机数生成方法

尽管 LCG 计算简单,但如果需要更高质量的随机数,推荐:

  • Xorshift:更快,适用于高效随机数生成
  • PCG(Permuted Congruential Generator):高质量 + 低计算量
  • Crypto-safe PRNGs(如 ChaCha20):适用于密码学

8. 总结

  • 线性同余法(LCG)是一种简单、快速的伪随机数生成算法,使用递推公式生成数列。
  • LCG 的随机性取决于参数(a,c,m),OpenCV 采用的是 Numerical Recipes 的参数。
  • 适用于简单随机数需求,但不适用于高精度或安全性要求高的场景。
  • 现代高质量随机数生成器如 Mersenne Twister, Xorshift, PCG 逐渐取代了 LCG。

➡ 结论:LCG 适用于一般场景,但更好的随机数生成方法可用于更高级应用! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解&#xff0c;欢迎大佬指出我文章的问题&#xff0c;一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表&#xff1f;k8s nodeport模式的原理&#xff1f; 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…

CommonAPI学习笔记-2

一. 概述 ​ 这篇文章主要是想整理并且分析CommonAPI代码生成工具根据fidl和fdepl配置文件生成出来的代码的结构和作用。 二. fidl ​ 用户根据业务需求在fidl文件中定义业务服务接口的结构以及自定义数据类型&#xff0c;然后使用core生成工具传入fidl文件生成该fidl的核心…

什么叫DeepSeek-V3,以及与GPT-4o的区别

1. DeepSeek 的故事 1.1 DeepSeek 是什么&#xff1f; DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的问世 DeepSeek-V3 是…

数据结构:队列篇

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 文章目录 系列文章目录前言一.队列的概念和结构1.1概念一、动态内存管理优势二、操作效率与安全性…

MySQL

二进制方式&#xff1a; 下载并上传安装包到设备 创建组与用户 [rootlocalhost ~]# groupadd mysql [rootlocalhost ~]# useradd -r -g mysql -s /bin/false mysql解压安装包&#xff1a; [rootlocalhost ~]# tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz -C /usr/l…

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

洛谷网站: P3029 [USACO11NOV] Cow Lineup S 题解

题目传送门&#xff1a; P3029 [USACO11NOV] Cow Lineup S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 这道题的核心问题是在一条直线上分布着不同品种的牛&#xff0c;要找出一个连续区间&#xff0c;使得这个区间内包含所有不同品种的牛&#xff0c;…

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…

360手机刷机 360手机解Bootloader 360手机ROOT

360手机刷机 360手机解Bootloader 360手机ROOT 问&#xff1a;360手机已停产&#xff0c;现在和以后&#xff0c;能刷机吗&#xff1f; 答&#xff1a;360手机&#xff0c;是肯定能刷机的 360手机资源下载网站 360手机-360手机刷机RootTwrp 360os.top 360rom.github.io 一、…

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…

排序算法--计数排序

唯一种没有比较的排序(指没有前后比较,还是有交换的)。统计每个元素出现的次数&#xff0c;直接计算元素在有序序列中的位置&#xff0c;要求数据是整数且范围有限。适用于数据为小范围整数&#xff08;如年龄、成绩&#xff09;&#xff0c;数据重复率较高时效率更优。可用于小…

PyTorch快速入门

Anaconda Anaconda 是一款面向科学计算的开源 Python 发行版本&#xff0c;它集成了众多科学计算所需的库、工具和环境管理系统&#xff0c;旨在简化包管理和部署&#xff0c;提升开发与研究效率。 核心组件&#xff1a; Conda&#xff1a;这是 Anaconda 自带的包和环境管理…

树莓派卷积神经网络实战车牌检测与识别

文章目录 树莓派介绍1. 树莓派的硬件规格2. 树莓派的操作系统3. 树莓派的应用场景 研究背景一、效果演示1.0 项目获取1.1 图像识别1.2 视频识别 二、技术原理2.1 整体流程2.2 CCPD数据集介绍2.3 车牌定位2.4 车牌矫正2.5 车牌识别2.5.1 CRNN概述2.5.2 CRNN网络架构实现2.5.3 CN…

Redis入门概述

1.1、Redis是什么 Redis&#xff1a;官网 高性能带有数据结构的Key-Value内存数据库 Remote Dictionary Server&#xff08;远程字典服务器&#xff09;是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;例如String、Hash、List、Set、SortedSet等等。数据…

如何在自己电脑上私有化部署deep seek

要在自己的电脑上私有化部署 DeepSeek&#xff0c;通常需要以下步骤&#xff1a; 1. 环境准备 操作系统&#xff1a;确保你的电脑操作系统支持 Docker 或直接安装 Python 环境&#xff08;如 Linux、Windows 或 macOS&#xff09;。 Python 环境&#xff1a;安装 Python 3.7 …

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…

k8s集群

文章目录 项目描述项目环境系统与软件版本概览项目步骤 环境准备IP地址规划关闭selinux和firewall配置静态ip地址修改主机名添加hosts解析 项目步骤一、使用kubeadm安装k8s单master的集群环境&#xff08;1个master2个node节点&#xff09;1、互相之间建立免密通道2.关闭交换分…

HTTP和HTTPS协议详解

HTTP和HTTPS协议详解 HTTP详解什么是http协议http协议的发展史http0.9http1.0http1.1http2.0 http协议的格式URI和URL请求request响应response http协议完整的请求与响应流程 HTTPS详解为什么使用HTTPSSSL协议HTTPS通信过程TLS协议 HTTP详解 什么是http协议 1、全称Hyper Tex…

2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存

一、DouyinLiveRecorder软件介绍&#xff08;文末提供下载&#xff09; 官方地址&#xff1a;GitHub - ihmily/DouyinLiveRecorder 本文信息来源于作者GitHub地址 一款简易的可循环值守的直播录制工具&#xff0c;基于FFmpeg实现多平台直播源录制&#xff0c;支持自定义配置录制…

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…