鸿蒙NEXT开发案例:随机数生成

【引言】

本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。

【环境准备】

• 操作系统:Windows 10
• 开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806
• 目标设备:华为Mate60 Pro
• 开发语言:ArkTS
• 框架:ArkUI
• API版本:API 12

【关键技术点】

1. 用户界面设计

用户界面主要包括以下几个部分:

• 标题栏:显示应用名称。
• 输入框:用户可以输入随机数的起始值、结束值和生成个数。
• 开关:用户可以选择生成的随机数是否允许重复。
• 生成按钮:点击后生成随机数。
• 结果显示区:显示生成的随机数,并提供复制功能。

2. 随机数生成算法

随机数生成是本项目的重点。根据用户是否允许生成重复的随机数,算法分为两种情况:

2.1 不允许重复

当用户选择不允许生成重复的随机数时,程序使用一个 Set 来存储生成的随机数,利用 Set 的特性自动去重。具体步骤如下:

1)计算范围:计算用户指定的随机数范围 range = endValue - startValue + 1。

2)生成随机数:使用一个临时数组 tempArray 来辅助生成不重复的随机数。每次生成一个随机索引 randomIndex,从 tempArray 中取出或计算一个新的随机数 randomNum,并将其添加到 Set 中。

3)更新临时数组:将 tempArray 中末尾的元素移动到随机位置,以确保下次生成的随机数仍然是唯一的。

if (!this.isUnique) {if (countValue > range) {// 显示错误提示this.getUIContext().showAlertDialog({title: '错误提示',message: `请求的随机数数量超过了范围内的总数`,confirm: {defaultFocus: true,value: '我知道了',fontColor: Color.White,backgroundColor: this.primaryColor,action: () => {}},onWillDismiss: () => {},alignment: DialogAlignment.Center,});return;}for (let i = 0; i < countValue; i++) {let randomIndex = Math.floor(Math.random() * (range - i));let randomNum = 0;if (tempArray[randomIndex] !== undefined) {randomNum = tempArray[randomIndex];} else {randomNum = startValue + randomIndex;}generatedNumbers.add(randomNum);if (tempArray[range - 1 - i] === undefined) {tempArray[range - 1 - i] = startValue + range - 1 - i;}tempArray[randomIndex] = tempArray[range - 1 - i];}this.generatedNumbers = JSON.stringify(Array.from(generatedNumbers));
}

2.2 允许重复

当用户选择允许生成重复的随机数时,程序直接在指定范围内生成随机数,并将其添加到结果数组中。

else {for (let i = 0; i < this.countValue; i++) {let randomNumber = this.startValue + Math.floor(Math.random() * (this.endValue - this.startValue));tempArray.push(randomNumber);}this.generatedNumbers = JSON.stringify(tempArray);
}

3. 剪贴板功能

为了方便用户使用,程序提供了将生成的随机数复制到剪贴板的功能。具体实现如下:

private copyToClipboard(text: string): void {const pasteboardData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text);const systemPasteboard = pasteboard.getSystemPasteboard();systemPasteboard.setData(pasteboardData);promptAction.showToast({ message: '已复制' });
}

【完整代码】

// 导入剪贴板服务模块,用于后续实现复制功能
import { pasteboard } from '@kit.BasicServicesKit';
// 导入用于显示提示信息的服务
import { promptAction } from '@kit.ArkUI';// 使用装饰器定义一个入口组件,这是应用的主界面
@Entry
@Component
struct RandomNumberGenerator {// 定义基础间距,用于布局中的间距设置@State private baseSpacing: number = 30;// 存储生成的随机数字符串@State private generatedNumbers: string = '';// 应用的主题色@State private primaryColor: string = '#fea024';// 文本的颜色@State private fontColor: string = "#2e2e2e";// 输入框是否获取焦点的状态变量@State private isFocusStart: boolean = false;@State private isFocusEnd: boolean = false;@State private isFocusCount: boolean = false;// 是否允许生成的随机数重复@State private isUnique: boolean = true;// 随机数生成的起始值@State private startValue: number = 0;// 随机数生成的结束值@State private endValue: number = 0;// 要生成的随机数个数@State private countValue: number = 0;// 生成随机数的方法private generateRandomNumbers(): void {const startValue = this.startValue; // 获取当前设定的起始值const endValue = this.endValue; // 获取当前设定的结束值const countValue = this.countValue; // 获取当前设定的生成个数const range: number = endValue - startValue + 1; // 计算生成范围// 用于存储生成的随机数const generatedNumbers = new Set<number>(); // 使用Set来自动去重const tempArray: number[] = []; // 临时数组,用于辅助生成不重复的随机数// 如果不允许重复,则使用去重算法生成随机数if (!this.isUnique) {// 如果请求的随机数数量超过了范围内的总数,则显示错误提示if (countValue > range) {this.getUIContext().showAlertDialog({title: '错误提示',message: `请求的随机数数量超过了范围内的总数`,confirm: {defaultFocus: true,value: '我知道了',fontColor: Color.White,backgroundColor: this.primaryColor,action: () => {} // 点击确认后的回调},onWillDismiss: () => {}, // 对话框即将关闭时的回调alignment: DialogAlignment.Center, // 对话框的对齐方式});return;}for (let i = 0; i < countValue; i++) {let randomIndex = Math.floor(Math.random() * (range - i)); // 在剩余范围内选择一个随机索引let randomNum = 0;if (tempArray[randomIndex] !== undefined) { // 如果索引位置已有值,则使用该值randomNum = tempArray[randomIndex];} else {randomNum = startValue + randomIndex; // 否则计算新的随机数}generatedNumbers.add(randomNum); // 添加到Set中,自动去重if (tempArray[range - 1 - i] === undefined) { // 更新末尾元素的位置tempArray[range - 1 - i] = startValue + range - 1 - i;}tempArray[randomIndex] = tempArray[range - 1 - i]; // 将末尾元素移到随机位置}// 将生成的随机数转换成JSON格式的字符串this.generatedNumbers = JSON.stringify(Array.from(generatedNumbers));} else {// 如果允许重复,则直接生成随机数for (let i = 0; i < this.countValue; i++) {let randomNumber = this.startValue + Math.floor(Math.random() * (this.endValue - this.startValue));tempArray.push(randomNumber);}// 将生成的随机数转换成JSON格式的字符串this.generatedNumbers = JSON.stringify(tempArray);}}// 将生成的随机数复制到剪贴板的方法private copyToClipboard(text: string): void {const pasteboardData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text); // 创建剪贴板数据const systemPasteboard = pasteboard.getSystemPasteboard(); // 获取系统剪贴板systemPasteboard.setData(pasteboardData); // 设置剪贴板数据// 显示复制成功的提示信息promptAction.showToast({ message: '已复制' });}// 构建页面布局的方法build() {Column() {// 标题栏,展示应用名Text("随机数生成").width('100%') // 设置宽度为100%.height(54) // 设置高度为54.fontSize(18) // 设置字体大小为18.fontWeight(600) // 设置字体粗细为600.backgroundColor(Color.White) // 设置背景颜色为白色.textAlign(TextAlign.Center) // 设置文本居中对齐.fontColor(this.fontColor); // 设置文本颜色// 随机数范围设置区域Column() {Row() {Text(`随机数范围`).fontWeight(600) // 设置字体粗细为600.fontSize(18) // 设置字体大小为18.fontColor(this.fontColor); // 设置文本颜色}.margin({ top: `${this.baseSpacing}lpx`, left: `${this.baseSpacing}lpx` }); // 设置边距// 输入随机数范围的两个值Row() {TextInput({ placeholder: '开始(>=)' }) // 输入框,显示占位符.layoutWeight(1) // 设置布局权重为1.type(InputType.Number) // 设置输入类型为数字.placeholderColor(this.isFocusStart ? this.primaryColor : Color.Gray) // 设置占位符颜色.fontColor(this.isFocusStart ? this.primaryColor : this.fontColor) // 设置文本颜色.borderColor(this.isFocusStart ? this.primaryColor : Color.Gray) // 设置边框颜色.borderWidth(1) // 设置边框宽度.borderRadius(10) // 设置圆角半径.backgroundColor(Color.White) // 设置背景颜色.showUnderline(false) // 不显示下划线.onBlur(() => this.isFocusStart = false) // 输入框失去焦点时的处理.onFocus(() => this.isFocusStart = true) // 输入框获得焦点时的处理.onChange((value: string) => this.startValue = Number(value)); // 输入值变化时的处理// 分隔符Line().width(10) // 设置分隔符宽度TextInput({ placeholder: '结束(<=)' }) // 输入框,显示占位符.layoutWeight(1) // 设置布局权重为1.type(InputType.Number) // 设置输入类型为数字.placeholderColor(this.isFocusEnd ? this.primaryColor : Color.Gray) // 设置占位符颜色.fontColor(this.isFocusEnd ? this.primaryColor : this.fontColor) // 设置文本颜色.borderColor(this.isFocusEnd ? this.primaryColor : Color.Gray) // 设置边框颜色.borderWidth(1) // 设置边框宽度.borderRadius(10) // 设置圆角半径.backgroundColor(Color.White) // 设置背景颜色.showUnderline(false) // 不显示下划线.onBlur(() => this.isFocusEnd = false) // 输入框失去焦点时的处理.onFocus(() => this.isFocusEnd = true) // 输入框获得焦点时的处理.onChange((value: string) => this.endValue = Number(value)); // 输入值变化时的处理}.margin({left: `${this.baseSpacing}lpx`, // 左边距right: `${this.baseSpacing}lpx`, // 右边距top: `${this.baseSpacing}lpx`, // 上边距});// 输入生成随机数的个数Text('生成随机数个数').fontWeight(600) // 设置字体粗细为600.fontSize(18) // 设置字体大小为18.fontColor(this.fontColor) // 设置文本颜色.margin({ left: `${this.baseSpacing}lpx`, top: `${this.baseSpacing}lpx` }); // 设置边距Row() {TextInput({ placeholder: '' }) // 输入框,显示占位符.layoutWeight(1) // 设置布局权重为1.type(InputType.Number) // 设置输入类型为数字.placeholderColor(this.isFocusCount ? this.primaryColor : Color.Gray) // 设置占位符颜色.fontColor(this.isFocusCount ? this.primaryColor : this.fontColor) // 设置文本颜色.borderColor(this.isFocusCount ? this.primaryColor : Color.Gray) // 设置边框颜色.borderWidth(1) // 设置边框宽度.borderRadius(10) // 设置圆角半径.backgroundColor(Color.White) // 设置背景颜色.showUnderline(false) // 不显示下划线.onBlur(() => this.isFocusCount = false) // 输入框失去焦点时的处理.onFocus(() => this.isFocusCount = true) // 输入框获得焦点时的处理.onChange((value: string) => this.countValue = Number(value)); // 输入值变化时的处理}.margin({left: `${this.baseSpacing}lpx`, // 左边距right: `${this.baseSpacing}lpx`, // 右边距top: `${this.baseSpacing}lpx`, // 上边距});// 设置数字是否可重复的开关Row() {Text('数字是否可重复').fontWeight(400) // 设置字体粗细为400.fontSize(16) // 设置字体大小为16.fontColor(this.fontColor) // 设置文本颜色.layoutWeight(1); // 设置布局权重为1Toggle({ type: ToggleType.Checkbox, isOn: this.isUnique }) // 切换按钮.width('100lpx') // 设置宽度.height('50lpx') // 设置高度.borderColor(Color.Gray) // 设置边框颜色.selectedColor(this.primaryColor) // 设置选中时的颜色.onChange((isOn: boolean) => this.isUnique = isOn) // 切换状态变化时的处理.align(Alignment.End); // 设置对齐方式为右对齐}.margin({top: `${this.baseSpacing}lpx`, // 上边距}).width('100%') // 设置宽度为100%.padding({left: `${this.baseSpacing}lpx`, // 左内边距right: `${this.baseSpacing}lpx`, // 右内边距top: `${this.baseSpacing / 3}lpx`, // 上内边距}).hitTestBehavior(HitTestMode.Block) // 设置点击测试行为.onClick(() => this.isUnique = !this.isUnique); // 点击时切换状态// 生成随机数的按钮Text('开始生成').fontColor(Color.White) // 设置文本颜色为白色.backgroundColor(this.primaryColor) // 设置背景颜色为主题色.height(54) // 设置高度为54.textAlign(TextAlign.Center) // 设置文本居中对齐.borderRadius(10) // 设置圆角半径.fontSize(18) // 设置字体大小为18.width(`${650 - this.baseSpacing * 2}lpx`) // 设置宽度.margin({top: `${this.baseSpacing}lpx`, // 上边距left: `${this.baseSpacing}lpx`, // 左边距right: `${this.baseSpacing}lpx`, // 右边距bottom: `${this.baseSpacing}lpx` // 下边距}).clickEffect({ level: ClickEffectLevel.HEAVY, scale: 0.8 }) // 设置点击效果.onClick(() => this.generateRandomNumbers()); // 点击时生成随机数}.width('650lpx') // 设置宽度.margin({ top: 20 }) // 设置上边距.backgroundColor(Color.White) // 设置背景颜色为白色.borderRadius(10) // 设置圆角半径.alignItems(HorizontalAlign.Start); // 设置水平对齐方式为左对齐// 显示生成的随机数Column() {Text(`生成的随机数为:`).fontWeight(600) // 设置字体粗细为600.fontSize(18) // 设置字体大小为18.fontColor(this.fontColor) // 设置文本颜色.margin({top: `${this.baseSpacing}lpx`, // 上边距left: `${this.baseSpacing}lpx`, // 左边距});Text(`${this.generatedNumbers}`) // 显示生成的随机数.width('650lpx') // 设置宽度.fontColor(this.primaryColor) // 设置文本颜色为主题色.fontSize(18) // 设置字体大小为18.textAlign(TextAlign.Center) // 设置文本居中对齐.padding({ left: 5, right: 5 }) // 设置内边距.margin({top: `${this.baseSpacing / 3}lpx` // 上边距});// 复制生成的随机数到剪贴板的按钮Text('复制').enabled(this.generatedNumbers ? true : false) // 按钮是否可用.fontColor(Color.White) // 设置文本颜色为白色.backgroundColor(this.primaryColor) // 设置背景颜色为主题色.height(54) // 设置高度为54.textAlign(TextAlign.Center) // 设置文本居中对齐.borderRadius(10) // 设置圆角半径.fontSize(18) // 设置字体大小为18.width(`${650 - this.baseSpacing * 2}lpx`) // 设置宽度.margin({top: `${this.baseSpacing}lpx`, // 上边距left: `${this.baseSpacing}lpx`, // 左边距right: `${this.baseSpacing}lpx`, // 右边距bottom: `${this.baseSpacing}lpx` // 下边距}).clickEffect({ level: ClickEffectLevel.HEAVY, scale: 0.8 }) // 设置点击效果.onClick(() => this.copyToClipboard(this.generatedNumbers)); // 点击时复制随机数}.width('650lpx') // 设置宽度.backgroundColor(Color.White) // 设置背景颜色为白色.borderRadius(10) // 设置圆角半径.margin({ top: `${this.baseSpacing}lpx` }) // 设置上边距.alignItems(HorizontalAlign.Start); // 设置水平对齐方式为左对齐}.height('100%') // 设置高度为100%.width('100%') // 设置宽度为100%.backgroundColor("#f2f3f5"); // 设置背景颜色}
}

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

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

相关文章

【Android】Service使用方法:本地服务 / 可通信服务 / 前台服务 / 远程服务(AIDL)

1 本地Service 这是最普通、最常用的后台服务Service。 1.1 使用步骤 步骤1&#xff1a;新建子类继承Service类&#xff1a;需重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法步骤2&#xff1a;构建用于启动Service的Intent对象步骤3&#xff1a;调用st…

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …

双因子认证:统一运维平台安全管理策略

01双因子认证概述 双因子认证&#xff08;Two-Factor Authentication&#xff0c;简称2FA&#xff09;是一种身份验证机制&#xff0c;它要求用户提供两种不同类型的证据来证明自己的身份。这通常包括用户所知道的&#xff08;如密码&#xff09;、用户所拥有的&#xff08;如…

Apple Vision Pro开发002-新建项目配置

一、新建项目 可以选择默认的&#xff0c;也可以选择Universal 3D 二、切换打包平台 注意选择Target SDK为Devices SDk&#xff0c;这种适配打包到真机调试 三、升级新的Input系统 打开ProjectSettings&#xff0c;替换完毕之后引擎会重启 四、导入PolySpatial 修改上图红…

瑞佑液晶控制芯片RA6807系列介绍 (三)软件代码详解 Part.10(让PNG图片动起来)完结篇

RA6807是RA8876M的缩小版&#xff0c;具备RA8876M的所有功能&#xff0c;只将MCU控制接口进行缩减&#xff0c;仅保留SPI-3和I2C接口&#xff0c;其它功能基本相同。 该芯片最大可控制854x600的分辨率&#xff0c;内建64Mbits显存&#xff0c;多个图层&#xff0c;使用起来相当…

机器人SLAM建图与自主导航:从基础到实践

前言 这篇文章我开始和大家一起探讨机器人SLAM建图与自主导航 &#xff0c;在前面的内容中&#xff0c;我们介绍了差速轮式机器人的概念及应用&#xff0c;谈到了使用Gazebo平台搭建仿真环境的教程&#xff0c;主要是利用gmapping slam算法&#xff0c;生成一张二维的仿真环境…

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

Robot | 用 RDK 做一个小型机器人(更新中)

目录 前言架构图开发过程摄像头模型转换准备校准数据使用 hb_mapper makertbin 工具转换模型 底版开发 结语 前言 最近想开发一个小型机器人&#xff0c;碰巧看到了 RDK x5 发布了&#xff0c;参数对于我来说非常合适&#xff0c;就买了一块回来玩。 外设也是非常丰富&#xf…

如何在 UniApp 中实现 iOS 版本更新检测

随着移动应用的不断发展&#xff0c;保持应用程序的更新是必不可少的&#xff0c;这样用户才能获得更好的体验。本文将帮助你在 UniApp 中实现 iOS 版的版本更新检测和提示&#xff0c;适合刚入行的小白。我们将分步骤进行说明&#xff0c;每一步所需的代码及其解释都会一一列出…

软件工程导论 选填题知识点总结

一 原型化方法是一种动态定义需求的方法&#xff0c;提供完整定义的需求不是原型化方法的特征&#xff0c;其特征包括尽快建立初步需求、简化项目管理以及加强用户参与和决策。 软件危机的表现包括用户对已完成的软件系统不满意的现象经常发生、软件产品的质量往往靠不住、软件…

软件测试面试之常规问题

1.描述一下测试过程 类似题目:测试的生命周期 思路:这是一个“范围”很大的题目&#xff0c;而且回答时间一般在3分钟之内&#xff0c;不可能非常详细的描述整个过程&#xff0c;因此答题的思路要从整体结构入手&#xff0c;不要过细。为了保证答案的准确性&#xff0c;可以引…

Linux|内存级文件原理

目录 进程与文件 Linux下的文件系统 文件操作&#xff0c;及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时&#xff0c;文件必须…

洛谷 P1722 矩阵 II C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1722 我们按照案例画一下 我们会发现&#xff0c;会出现重复的子结构。 代码如下&#xff1a; #include<iostream> using namespace std; int mem[300][300]; int n; int f[305][305]; int dfs(int x,int red,…

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…

半导体、晶体管、集成电路、芯片、CPU、单片机、单片机最小系统、单片机开发板-概念串联辨析

下面概念定义从小到大串联&#xff1a; 半导体&#xff08;semiconductor&#xff09;&#xff1a; 是一类常温下导电性能介于导体与绝缘体之间的材料&#xff0c;这种材料的导电性可以随着外部环境比如电压、温度、光照的变换而改变&#xff0c;导电特性区别于导体、超导体、…

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是&#xff1a; 在官网说明里&#xff0c;才版本2024.1开始&#xff0c;默认启用的 Vue Language Server&#xff0c;但是在 Vue 2 项目…

app小程序web安全—sign签名绕过

一、环境准备 本文测试环境为JeecgBoot&#xff0c;代码链接&#xff1a;jeecgboot/Github 环境配置链接&#xff1a;IDEA启动项目 - JeecgBoot 文档中心 配置好依赖和数据库后启动后端&#xff1a;org.jeecg.JeecgSystemApplication 启动Vue3前端&#xff0c;点击dev&…

Javaweb前端HTML css 整体布局

最后一个是线条颜色 盒子&#xff0c;整体还是300&#xff0c;400

51单片机基础 06 串口通信与串口中断

目录 一、串口通信 二、串口协议 三、原理图 四、串口通信配置参数 1、常用的串行口工作方式1 2、数据发送 3、数据接收 4、波特率计算 5、轮询接收 6、中断接收 一、串口通信 串口通信是一种常见的数据传输方式&#xff0c;广泛用于计算机与外部设备或嵌入式系统之间…

003 STM32基础、架构以及资料介绍——常识

注&#xff1a; 本笔记参考学习B站官方视频教程&#xff0c;免费公开交流&#xff0c;切莫商用。内容可能有误&#xff0c;具体以官方为准&#xff0c;也欢迎大家指出问题所在。 01什么是STM32&#xff08;宏观&#xff09; STM32属于一个微控制器&#xff0c;自带了各种常用通…