HarmonyOS RandomUtil 随机数生成全攻略:整数、浮点数、布尔值一次搞定

HarmonyOS RandomUtil 随机数生成全攻略:整数、浮点数、布尔值一次搞定

文章目录

    • 背景
      • 总览方法
      • getRandomBoolean:随机布尔值
      • getRandomInt:随机整数
      • getRandomNumber:随机浮点数
      • getRandomLimit:生成 [0, limit) 范围内的随机整数
      • 三个数字随机方法对比
      • getRandomDataBlob 和 getRandomUint8Array:随机字节数据
      • 写在最后

背景

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

日常开发里,随机数的需求很常见:随机排序、抽奖、生成测试数据、随机颜色……虽然 ArkTS 有原生的Math.random(),但RandomUtil封装了更丰富的方法,用起来更方便。

总览方法

先来看下这个三方库的方法有哪些

getRandomBoolean:随机布尔值

最简单的一个,随机返回truefalse

this.Btn('生成随机 Boolean','#4A90E2',()=>{constv=RandomUtil.getRandomBoolean();this.addLog(`getRandomBoolean() →${v}`);})

使用场景

  • A/B 测试中随机给用户分配实验组
  • 游戏里随机触发某个事件(50% 概率)
  • 生成随机测试数据时随机设置布尔字段

getRandomInt:随机整数

生成指定范围内的随机整数(包含两端边界值):

this.Btn(`getRandomInt(${this.intMin},${this.intMax})`,'#5A8DEE',()=>{constv=RandomUtil.getRandomInt(this.intMin,this.intMax);this.addLog(`getRandomInt(${this.intMin},${this.intMax}) →${v}`);})this.Btn('getRandomInt() 默认范围','#5A8DEE',()=>{constv=RandomUtil.getRandomInt();this.addLog(`getRandomInt() →${v}`);})

Demo 里有两个输入框让你设置 min 和 max:

Row({space:8}){TextInput({text:this.intMin.toString(),placeholder:'min'}).layoutWeight(1).height(38).fontSize(13).type(InputType.Number).onChange(v=>{this.intMin=parseInt(v)||0;})TextInput({text:this.intMax.toString(),placeholder:'max'}).layoutWeight(1).height(38).fontSize(13).type(InputType.Number).onChange(v=>{this.intMax=parseInt(v)||100;})}

实际运行结果

  • getRandomInt(1, 100)→ 1 到 100 之间的随机整数(包含 1 和 100)
  • getRandomInt()→ 默认范围内的随机整数

使用场景:抽奖序号生成、随机选取数组索引、骰子点数(getRandomInt(1, 6)

getRandomNumber:随机浮点数

生成指定范围内的随机浮点数:

this.Btn('getRandomNumber(10, 50)','#7B68EE',()=>{constv=RandomUtil.getRandomNumber(10,50);this.addLog(`getRandomNumber(10, 50) →${v}`);})

实际运行结果getRandomNumber(10, 50)→ 类似23.847...这样的浮点数

getRandomInt的区别:getRandomInt返回整数,getRandomNumber返回带小数的浮点数。

使用场景

  • 生成随机坐标(需要精确的经纬度)
  • 生成随机价格(需要小数)
  • 模拟传感器数据

getRandomLimit:生成 [0, limit) 范围内的随机整数

getRandomInt的区别是:getRandomLimit的范围是[0, limit)(不含 limit),即从 0 开始,最大值是 limit-1:

this.Btn('getRandomLimit(20)','#9B59B6',()=>{constv=RandomUtil.getRandomLimit(20);this.addLog(`getRandomLimit(20) →${v}(范围[0,20))`);})

实际运行结果getRandomLimit(20)→ 0 到 19 之间的整数

使用场景:随机选取数组中的一个元素时,getRandomLimit(array.length)直接作为索引使用:

constitems=['苹果','香蕉','橙子','草莓'];constrandomIndex=RandomUtil.getRandomLimit(items.length);constrandomItem=items[randomIndex];// 随机选一个水果

三个数字随机方法对比

方法范围类型典型使用
getRandomBoolean()true/falseboolean随机判断
getRandomInt(min, max)[min, max]integer随机整数,有范围
getRandomInt()默认范围integer快速随机整数
getRandomNumber(min, max)[min, max)float随机浮点数
getRandomLimit(limit)[0, limit)integer随机数组索引

getRandomDataBlob 和 getRandomUint8Array:随机字节数据

有时候需要生成随机的二进制数据,比如测试数据、加密随机盐:

this.Btn('getRandomDataBlob(8)','#E67E22',()=>{constblob=RandomUtil.getRandomDataBlob(8);this.addLog(`getRandomDataBlob(8).data → [${Array.from(blob.data).join(',')}]`);})this.Btn('getRandomUint8Array(6)','#E67E22',()=>{constarr=RandomUtil.getRandomUint8Array(6);this.addLog(`getRandomUint8Array(6) → [${Array.from(arr).join(',')}]`);})

实际运行结果

  • getRandomDataBlob(8)→ 8 个随机字节,每次结果不同,比如[23, 187, 45, 201, 7, 156, 89, 234]
  • getRandomUint8Array(6)→ 6 个随机字节的 Uint8Array

DataBlobUint8Array的区别:

  • DataBlob是 HarmonyOS 特有的类型,有.data属性(本质上就是Uint8Array
  • Uint8Array是标准的 JavaScript 类型,更通用

使用场景:加密操作需要随机盐(salt)时使用这两个方法生成。

写在最后

这篇把RandomUtil里数值相关的随机方法都过了一遍。下一篇讲字符串随机和颜色随机,以及 UUID 生成——这些在实际项目里用得也很多。