ns-3中随机数机制

【网络仿真】ns-3安装与简介 List item 阅读详情

前言

ns-3是离散事件仿真平台,它由内核部分和常用模块两个部分组成。它的内核是用C++实现的。可以在src/core目录下查看,也可以在ns3的在线doxygen文档中查阅。

内核包含很多部分,实现了很多底层API供用户使用。因为仿真中经常需要模拟现实环境中的不确定行为,因而随机数机制是ns-3中非常重要的部分。了解随机数机制对仿真模拟真实随机情况非常重要,本文将详细讲解关于ns-3随机数的内容。

本文之后的部分将按照以下章节展开:

1.随机数生成器的背景
2.ns-3中的伪随机数生成器(PRNG,Pseudo Random Number Generator)
3.ns-3中常用的随机变量()

在第1点中将结合ns-3讨论常见的随机数生成器;在第2点中首先简单讲述ns-3中PRNG的特性,然后讲述ns-3中PNRG的常见使用方法;在第3点中介绍ns-3中常用的随机变量,包括满足均匀分布、正态分布、等差分布等的随机变量


一、背景:随机数生成器RNG

在了解ns-3中随机数机制之前,如果你之前对随机数生成器(RNG,Random Number Generator)理解的不是很清楚,非常有必要了解什么是随机数生成器。

计算机是按照事先确定的算法和程序进行确定的运算,都是确定性的计算。那么计算机到底是怎么得到随机数的?作为人类,我们大可提笔随便在纸上写一大串数字,也许就算是随机数了,但是计算机可没有这本事,它必须有一个科学稳定的随机数来源,才能得到随机数,这个来源,我们称为随机数生成器。

作为编程爱好者,应该会发现,每一门编程语言必然会有自己的随机数生成函数,常用的比如:C语言stdlib库中的rand()函数,java中Random类中的nextInt () 方法,Python中random模块的randint()方法等等。作为各种编程语言的“官方标配”,这小小的随机函数作用那也是大大的,不光而这看似简单的东西背后学问还真不少。

常见的计算机随机数生成器有三种:
参考文章 : 解密随机数生成器

一是使用物理方法,称为真随机数生成器(True Random Number Generator),生成的算是真正意义上的随机数,无法预测且无周期性;

与真随机数对应的是伪随机数生成器(Pseudo Random Number Generator),它是由算法计算得来的,但这种方法生成的随机数是可预测、有周期的,并不能算真的随机数,因此得名伪随机数;

还有第三种方法,叫随机数表法,就是用真随机数生成器事先生成好大量随机数,存到数据库中,使用时再从库中调用。记得高中数学书第三册后附有一个叫随机数表的东西,使用时直接查阅就行,这种方法简单,但缺点是内存占用大,因此不常采用。

在编程当中常常使用的就是伪随机数生成器。

伪随机数算法中重要术语:

PRNG中常常需要给定一个种子,映射出一个不确定的随机数。需要划重点的是:不同的种子映射的数值可以认为是没有规律的,可以认为是随机的。在这样的映射条件下,才有我们所说的随机数生成器,否则如果是确定的一一映射,完全无法体现随机这样一个概念。

每一个伪随机数生成器(PRNG)都会提供一个相当长的随机数序列,这个序列的长度称为循环周期或者循环长度,RNG在完成一次循环后将自动进行下一次重复。这个序列可以被分隔为几个相互独立的数据流。一个RNG的随机数据流是这个RNG序列的连续子集。例如,一个RNG队列长度为N,同时RNG提供2个数据流,第一个数据流使用序列的前半部分,第二个数据流使用序列的后半部分,这两个数据流是相互独立的。同样,每一个数据流还可以被分为更小的子流。

一个RNG最希望做到的就是提供一个非常长的循环序列,并有效的分配给每一个数据流。

伪随机数生成器有很多种算法,包括同余法、梅森旋转算法等多种多样的方法,我们此处重点介绍一下prerre L’Ecuyer提出的MRG32k3a生成器。它提供1.8*1 019相互独立的数据流,每个数据流又包含2.3*1 015个子数据流,并且每一个子数据流用甘油7.6*1 022的长度,因此整个生成器的循环周期为3.1*1 057。正因为RNG拥有这么长的序列,才保证了RNG产生的随机数具有很高的可信度。

MRG32k3生成器需要一个随机数种子,

敲黑板!敲黑板!敲黑板!
1.计算机一般都是确定性的计算和运行,只有借助随机数生成器才可以产生随机数
2.三种随机数生成器中,伪随机数生成器PRNG在编程中使用最频繁
3.伪随机数中,由种子映射到随机数时候可以认为映射是没有规律、是随机的
4.伪随机数生成器的循环周期足够长能够保证RNG的随机数具有更高的可信度


二、详解:ns-3中PRNG的使用

在ns-3中,仿真程序通常使用固定的种子,也就是产生固定的随机数,也就是固定的数值,所以仿真也就不存在不确定性,也即确定性仿真。

如果需要模拟不确定的情况,则需要改变PRNG的种子或者运行标识。

ns-3的随机数通过调用类ns3::RandomVariableStream来提供(在3.14版本及之前有ns3::Random Variable提供)。ns3::RandomVariableStream是对底层的随机数生成器进行封装之后向用户提供的使用接口。

PRNG的种子和运行标识分别存储在类GlobalValue的g_rngSeed和g_rngRun中,改变PRNG的种子或者运行标识通过ns3::RngSeedManager::SetSeed()和ns3::RngSeedmanager::SetRun()进行,下面对两种改变方式分别做介绍。

2.1 通过ns3::RngSeedManager::SetSeed()改变种子实现随机性

#include "ns3/simulator.h"
#include "ns3/nstime.h"
#include "ns3/command-line.h"
#include "ns3/rng-seed-manager.h"
#include "ns3/random-variable-stream.h"
#include <iostream>

using namespace ns3;

int main(int argc, char *argv[])
{
    CommandLine cmd;
    cmd.Parse(argc,argv);
    RngSeedManager::SetSeed(1);
    Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable>();
    std::cout<<uv->GetValue()<<std::endl;
    return 0;
}

上述代码中,首先通过RngSeedManager::SetSeed(1)设置种子为1,然后创建了一个类型为UniformRandomVariable的智能指针Ptr,其中UniformRandomVariable是ns3::RandomVariableStream的子类,所以通过uv调用GetValue()函数获得对应的值。
运行结果如下:

这里写图片描述

对于这个例子,在不改变SetSeed()函数参数的情况下连续运行两次,得到的随机数是一样的,如上图中所示,结果都是0.816532。将SetSeed()函数的参数修改为2,在运行一下,运行结果如下图,发现改变种子之后,得到的随机数结果是不一样的,seed=2的时候的结果变成0.633064。

这里写图片描述

2.2 通过ns3::RngSeedmanager::SetRun()改变运行标识实现随机性

在不改变种子的条件下,也可以通过改变 运行标识 来实现随机性,改变运行运行标识的方法也有4种:

①通过函数RngSeedManager::SetRun(4)改变运行标识
以下的实验中,分别使用RngSeedManager::SetRun(3)和RngSeedManager::SetRun(4)运行得到结果。

图1

②通过修改环境变量NS_GLOBAL_VALUE的值来修改运行标识
这种方法不需要对代码做修改,只需要在运行时候,在命令窗口进行设置。

NS_GLOBAL_VALUE="RngRun=3"./waf --run program-name

图2

③通过命令行传递参数来修改运行标识
这种方法也不需要对代码做修改,只需要在运行时候,在命令窗口进行设置。

./waf --run "program-name --RngRun=3"

这里写图片描述
④这种方式不使用waf,而是直接使用build

./build/optimized/scratch/program-name --RngRun=3

这种方法不太适用,此处不做演示。

**针对上述4种方式,第1种与改变方式的方式基本上是一致的,只需要把代码行RngSeedManager::SetSeed()用代码行RngSeedManager::SetRun()替换就可以,每次进行独立运行时改变参数就行。第二种方式比较繁琐,每次都要修改环境变量,所以建议还是使用第三种方法。

**需要注意的是:提倡使用改变运行标识的方法实现随机性。因为在改变种子的情况下进行重复试验,ns-3无法保证每个种子对应的RNG序列不会重复。而修改运行标识是使用RNG序列的不同的子序列,同一个RNG序列的子序列是不会重复的。


三、详解:ns-3中的随机变量类型

ns-3中一共有5种常用的随机变量,这5种都是

1.满足均匀分布的随机数
2.满足正态分布的随机数
3.满足指数分布的随机数
4.满足等差序列的随机数
5.返回一个固定的数值

以上5种分别对应了RandomVariableStream类的5个子类,下面一一进行解释。

1.UniformRandomVariable:给定最大值和最小值,按均匀分布的方式返回一个随机数
UniformRandomVariable是从RandomVariableStream继承的派生类,也是最基础和最常用的类。它有两个属性:

属性名称含义类型
Max均匀分布区间的上界ns3::DoubleValue
Min均匀分布区间的下界ns3::DoubleValue

以下是一个实例:

这里写图片描述

2.NormalRandomVariable:根据正态分布返回随机数
需要设置的属性值包括:

属性名称含义类型初始值
Mean返回值的均值ns3::DoubleValue0
Valance返回值的方差ns3::DoubleValue1
Bound返回值的上界ns3::DoubleValue1*10^307

3.ExponentialRandomVariable:根据指数概率分布返回随机数
需要设置的属性值包括:

属性名称含义类型初始值
Mean返回值的均值ns3::DoubleValue1
Bound返回值的上界ns3::DoubleValue0

4.SequentialRandomVariable:返回一串等差序列
如果超过了给定的最大上限,则重新从给定的最小值开始循环。序列随机变量的常用属性如下:

属性名称含义类型初始值
Min序列的最小值ns3::DoubleValue0
Max序列最大值的上限ns3::DoubleValue0
Increment序列的差值ns3::PointerValue1
consecutive序列中每个数重复的次数ns3::StringeValue1

5.ConstantRandomVariable:返回一个固定的数
其默认值是0,使用方法和均匀分布的例子一样。

RngSeedManager::SetSeed(3);
double dValue=10.0 //把默认初始值改为10
Ptr<ConstantRandomVariable> uv = CreateObject<ConstantRandomVariable>();
uv->SetAttribute("Constant",DoubleValue(dValue)); 
ns3网络模拟器 NS3网络模拟器 官方教学视频 https://www.bilibili.com/video/av28452403 NS-3网络仿真平台搭建及可视化 https://blog.youkuaiyun.com/HuaCode/article/details/79767851?utm_source=blogxgwz8 阅读详情

相关推荐

【网络仿真】ns-3基础(上)

目标:看完《ns3》,重点:如何写拓扑、模块 1 ns-3初识 资料: ns-3官网:http://www.nsnam.org/ ns-3官方开发文档:https://www.nsnam.org/releases/ns-3-34/documentation/ ns-3维基百科(文档中没有的内容)、FAQ问题解答:https://www.nsnam.org/support/ ns-3相关文献:https://www.nsnam.org/education/ 2 ns-3快速上手 使用waf配置编译ns-3

bajiaoyu517的博客 7469

ns-3和fmi简介

ns-3网络仿真器简介、协同仿真fmi标准介绍,ns-3导出fmu文件讲解

qq_38789531的博客 4829

从Linux学到NS2:(三)de番外

引言      本篇文章准备介绍一堆花里胡哨的东西,比如让nam运行起来像Android设计Activity那样多一些美感、用一句话实现上篇tcl脚本中的多行代码、将awk和xgraph嵌入到tcl的proc中使用等。既然是上一篇文章的番外当然也有干货,主要是对上篇仿真内容进行一些修正:取消最大缓冲区的设置,不产生丢包;减少一个路由器使包只经过一跳;设置传输时延为零,通过awk组件处理Trace文...

Miller_Mole的博客 644

ns-3环境搭建

ns-3简述、ns-3平台搭建、编译、vscode编译环境搭建

weixin_45721007的博客 4556

ESP32-S3硬件安全三要素:时钟毛刺防护、真随机数生成与UART零拷贝通信

嵌入式安全的核心在于从物理层构建可信根——时钟稳定性是系统行为可预测的前提,真随机数(TRNG)是密码学操作不可预测性的熵源基础,而安全通信通道则是密钥与敏感数据传输的保障载体。ESP32-S3在硅片级集成硬连线时钟毛刺检测模块(3 ns脉宽阈值)、多物理噪声源融合的TRNG引擎,以及支持GDMA零拷贝、RS485自动收发和深度睡眠唤醒的增强型UART控制器。三者通过硬件信号联动(如毛刺触发RNG冻结、UART发送触发IV采样),形成跨域纵深防御体系,广泛适用于工业物联网、智能电表、安全启动网关等对物理攻击

weixin_36474001的博客 84

无线网络仿真软件选型与NS-3入门实战指南

无线网络技术研发与验证中,仿真已成为基础设施级手段,它通过可控的信道模型和节点配置,解决了真实环境下成本高、不可复现、难以扩展的痛点。从协议逻辑到物理层算法,不同层级的研究需要借助不同类型的网络仿真工具,如NS-3、OMNeT++、MATLAB等,各自在学术研究、教学演示和系统级组网中扮演不同角色。理解离散事件仿真原理、信道建模方法和模块化设计,是高效进行网络性能评估与协议验证的关键。本文聚焦无线网络仿真软件的基础选型思路,对比主流工具的适用场景,并以NS-3为例给出完整的WiFi网络仿真入门案例,涵盖安装

weixin_32520095的博客 169

【NS3】核心概念和第三个程序例子

本文介绍了NS-3网络仿真中的关键组件和代码实现。首先阐述了随机数生成器在仿真中的重要性,以及NS-3提供的伪随机数生成器(PRNG)。其次说明了NS-3的对象模型基础类(Object、ObjectBase、SimpleRefCount)及其特性(属性系统、聚合系统、智能指针等)。最后通过一个网络拓扑示例代码,展示了如何创建包含点对点、CSMA和WiFi节点的混合网络,配置IP地址,设置UDP回显应用,并实现数据包捕获功能。该代码演示了NS-3中网络设备安装、协议栈配置、移动性模型设置等核心操作流程。

Double Galaxy 224

【ns-3】集成5G-LENA模块:从源码到仿真的完整指南

本文详细介绍了如何在ns-3中集成5G-LENA模块,从源码获取、环境配置到编译调试的全过程。5G-LENA模块填补了ns-3在5G NR仿真方面的空白,支持NSA和SA组网架构及毫米波频段仿真,是5G网络研究的强大工具。文章还分享了版本选择、编译技巧和实际项目经验,帮助研究者高效完成5G网络仿真工作。

weixin_33290540的博客 209

快手小程序__NS_sig3签名机制解析与逆向调试实战

请求签名是客户端与服务端之间用于身份校验与防篡改的常见机制,通常由可预测的参数拼接后通过不可逆哈希生成。理解其原理,对于接口联调、安全测试与自动化验证具有重要意义。在移动端小程序场景中,签名往往动态变化且绑定环境信息,增加了逆向分析的难度。本文以实际调试经验为基础,完整梳理了快手小程序请求头中`__NS_sig3`参数的定位思路、调用栈追踪、参数收集与验证方法,并分享了签名长度不符、本地重放失败等常见问题的排查技巧,有助于开发者快速掌握动态签名机制的解析套路。

weixin_29325955的博客 105

某手App请求签名sig与__NS_sig3逆向分析:从抓包到算法复现

在移动应用接口安全体系中,请求签名是服务端校验请求合法性与完整性的核心机制。无论是HTTP接口调试还是爬虫逆向,理解签名参数的生成逻辑都至关重要。通常,客户端会在请求中附加类似sig、__NS_sig3等动态字段,这些参数由特定算法基于请求路径、参数排序、时间戳、设备因子等材料计算而来。实际分析中,常借助抓包工具获取原始请求,再通过Hook技术定位签名函数并打印参与计算的字符串,从而还原整个拼接与哈希过程。掌握签名原理不仅能帮助开发者排查接口调用问题,也是研究风控策略、模拟请求的基础。本文以某手App v8

weixin_33646989的博客 210

JS逆向实战:某手平台__NS_sig3签名算法深度解析与纯算重构

在Web安全与数据交互领域,接口签名是保障通信安全与身份验证的核心机制。其基本原理是通过特定的加密算法,将请求参数、时间戳等要素与密钥结合,生成唯一的校验字符串,以防止请求被篡改或重放。这项技术的核心价值在于,它允许开发者在没有官方SDK的情况下,通过分析前端JavaScript代码,逆向推导出签名生成逻辑,从而实现稳定的自动化调用。这在数据采集、第三方集成和自动化测试等应用场景中尤为重要。本文以某手平台的`__NS_sig3`参数为例,深入剖析其生成原理。通过定位关键函数、分析调用栈、提取并简化混淆代码,

weixin_29315091的博客 553

9、ns-3内核

在官方文档ns-3-manual.pdf中,整个框架图: v 随机变量 伪随机生成器pseudo-random number generator (PRNG)。 默认情况下,ns-3仿真程序使用固定种子和运行数字,它们分别存在全局变量g_rngSeed 和 g_rngRun中,在ns-3.14版本以后,ns3::RandomVariableStream 代替ns3::Rand...

weixin_30654419的博客 444

MTK平台TP驱动设备树与GPIO配置实战解析

本文详细解析了MTK平台TP驱动开发中的设备树与GPIO配置实战。通过DCT工具配置GPIO引脚,结合设备树节点定义触摸参数,并分享驱动移植、编译调试技巧及常见问题解决方案,帮助开发者快速掌握MTK触摸驱动开发核心。

ice55的博客 233

NS2学习笔记——随机数产生器

了解如何在网络仿真过程中应用随机数产生器。 1.随机数产生器所产生的数值是由种子和分布所控制的,不同的种子或者是 分布就会产生不同的随机数。当一个种子和分布决定之后,随机数产生器会产生一出一个由一长串不同数字所组成的表格,当需要一个 随机数时,随机数产生器就会去选取这个表格中的一个数字,当需要另一个随机数时,随机数产生器就会去选取这个表格中第二个数字,依此类推。所以当使用种子 和分布相同时,

梦之境 1018

OpenBCI脑电帽硬件DIY与低成本搭建实战

本文详细介绍了如何通过第三方兼容硬件和开源设计,低成本DIY一套功能完备的OpenBCI脑电采集系统。从硬件选购、组装、软件配置到信号调试,提供了完整的实战指南,将总成本控制在千元级别,使脑机接口技术对爱好者、学生和研究者变得更加触手可及。

weixin_29322855的博客 786

ESP32S3编译micropython固件

编译ESP32芯片的micropython固件

m0_73253860的博客 2553

ns3-gym Python端API完全指南:Ns3Env的step、reset与动作空间操作实战教程

对于想要在**ns3-gym**中开展网络强化学习研究的新手来说,**Python端API**是最先接触、也最容易踩坑的部分。ns3-gym 是一个面向网络研究者的强化学习(RL)游乐场,它把 ns-3 网络仿真器与 OpenAI Gym 接口无缝对接,让你可以用熟悉的 Gym 风格代码训练智能体。本文将从 **Ns3Env** 环境类出发,逐行拆解 `step`、`reset` 两个核心方法,并

gitblog_00532的博客 1000

Spring AI 项目实战(五):Spring Boot + AI + DeepSeek + Redis 实现聊天应用上下文记忆功能(附完整源码)

本文介绍了如何基于Spring Boot 3.2、Spring AI 1.0.0-M4、DeepSeek API和Redis构建具备上下文记忆功能的智能聊天应用。项目采用现代化技术栈,包括Java 17、Maven、Lombok等,实现了智能对话、会话管理、异常处理等核心功能。文章详细讲解了环境搭建、配置管理(含Redis和AI服务集成)、核心组件设计(如消息实体、控制器和服务层实现),以及完整的项目结构。该项目提供了美观的Web界面和REST API,支持对话上下文存储(通过Redis实现)和系统监控,可

博客 829

gofakeit 随机数源(RNG)基准测试深度解析:从 2.6ns 的 Dumb 到 77ns 的 Crypto

本篇技术指南聚焦 gofakeit 开源仓库中的随机数源(Random Number Generator Source)性能基准文档 [source/BENCHMARKS.md](https://link.gitcode.com/i/1979eab98bf78b63c975550ce6407b04),逐条解读 PCG、ChaCha8、JSF、SFC、Old、Dumb、Crypto 七种随机数源的基

gitblog_00443的博客 294

彻底摆脱文献只能读开头的痛苦!这款文献检索神器真能帮你跨越文献付费限制(附实操演示)

大家是不是有过这样的经历,好不容易通过关键词搜到了和自己主题高度相关的文献,想要快速获取文献信息,推进研究进度,却又因为付费或者需订阅才能下载PDF,而被劝退。粘贴完成后,点击搜索,搜索结果页面会显示这篇文献的相关信息,有的文献有“下载PDF”,有的文献则只有“求助PDF”,不管是哪种情况,直接点击进入;我这里点击的是“下载PDF”,接着它会跳转页面。我用 Book 学术下载过不少付费文献,实测下来 80% 左右的文献,都能通过它的求助方式成功获取到,只有少部分文献等待的时间会稍微久一些或者没办法下载。

qq_64378896的博客 164

硬核反坑!YOLOv5训练避坑指南:根治梯度消失、不收敛、检测漏框三大核心问题(附实战代码+调优清单)

数据是基础,超参数是关键,模型是工具,训练策略是保障。梯度消失、不收敛、检测漏框这三大问题,本质上都是“数据-模型-训练”不匹配的结果。梯度消失/爆炸:优先调整学习率策略+梯度裁剪,其次优化模型结构;训练不收敛:优先清洗数据集,其次调优超参数,最后检查配置文件;检测漏框:优先重新聚类锚框,其次增强浅层特征,最后调整推理参数。YOLOv5训练的最高境界,不是调参,而是让数据、模型、训练策略三者完美匹配。按本文的方法反坑,你的YOLOv5训练一定能一次成功!🚀。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 233

ns3-gym入门:linear-mesh示例从场景到代码全解析

网络仿真与强化学习的结合,正在成为智能网络研究的重要方向。传统做法中,ns-3与Python训练脚本之间通过文件交换数据,同步困难且效率低下。ns3-gym通过将模拟器封装成标准Gym环境,实现了观测、动作、奖励的实时交互,让RL代理直接驱动仿真进程。理解其背后的原理,有助于快速构建网络决策场景。在众多示例中,linear-mesh以其简单清晰的链式拓扑和完整的交互流程,成为入门ns3-gym的最佳切入点。它展示了如何定义观测空间、动作空间与奖励函数,并串联起模拟器与代理的协作机制。本文拆解该示例的场景设定

weixin_33912246的博客 429

OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战

【代码】OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战。

m0_67505153的博客 188

NS-3 packet-socket-apps学习记录

/ 使用 Mersenne Twister 随机数生成器。//NS-3生成0到1均匀分布的伪随机数。//生成0到1的真正的随机数。

m0_60143090的博客 291

第14.7章 高翔博士最新开源框架Lightning-LM源码解读(七):PoseExtrapolator模块深度剖析,揭秘激光SLAM高频位姿外推核心技术

PoseExtrapolator是Lightning-LM框架中负责高频位姿外推的核心模块,通过融合DR(航位推算)、激光里程计和PGO(位姿图优化)数据实现精准实时定位。模块初始化依赖PGO数据,后续通过DR数据进行高频位姿更新,并利用PGO结果进行误差补偿。关键函数AddDRLocAndExtrapolate处理DR增量位姿,结合速度补偿机制逐步修正误差,保证高频输出的同时提升精度。该模块体现了多传感器融合思想,通过互补性数据(高频DR与低频高精PGO)实现鲁棒定位,代码中使用了SE3位姿表示、互斥锁保

行知SLAM 348

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

利用NS2的产生随机数机制来实现对链路的动态设置(连接建立时间,延迟)

set ns [new Simulator] set nf [open ex3out.nam w] $ns namtrace-all $nf     set tf [open ex3out.tr w] $ns trace-all $tf set windowVsTime [open win w] set param [open parameters w] #Define a 'f

梦之境 1246

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: C++拷贝构造函数解析
下一篇: ns-3中广泛应用的回调机制
LoongTech
博客等级 码龄11年 262粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值