likes
comments
collection
share

dev_prokit 之随机生成double、bool、int数组,可选安全/非安全,可设随机数是否重复

作者站长头像
站长
· 阅读数 10

往期优选推荐

推荐指数: ⭐️⭐️⭐️⭐️⭐️

》fam 和 flutter_gen 相比优点《

  1. fam 不需要在项目的 pubspec.yaml 文件的 dev_dependencies 引入任何东西;而 flutter_gen 需要引入 flutter_gen_runner

  2. fam 在导入资源后只需要执行 fam run 即可;而 flutter_gen 需要执行 dart run build_runner build 。需要注意的是 dart run build_runner build 是很多代码自动生成的运行指令(多语言、json解析、rividerpod...等)。所以一旦执行就需要很长时间才能完成,而 fam 拥有独立的体系,便捷快速!

  3. fam 的资源管理类在项目中使用简短;而 flutter_gen 需要使用.语法一直到资源文件,然后再通过 .path 获取资源路径,这很麻烦!

  4. fam 拥有独立的系统体系; flutter_gen 和多语言的使用有一定的冲突。

推荐指数: ⭐️⭐️⭐️⭐️⭐️

该篇文章包含了 dev_prokit 所有功能介绍和示例的目录。此文章能够让开发者快速的了解 dev_prokit 都提供了那些功能,以及能更快速的找到自己需要的功能介绍和应用。

本期功能介绍

一、起因

公司近期面临一个新的挑战,即需要从一个数组(元素不重复)中随机抽取N个独一无二的元素,每个元素均不可重复出现。面对这一需求,我们同样拥有简洁而高效的解决方案。核心思路如下:首先,利用随机数生成器来获取与所需元素数量相匹配的、不重复的数组索引值;随后,凭借这些精心挑选的索引值,我们就能精准地从原始数组中抽取对应的元素。其核心任务,即是从数组中精准地提取出特定数量的非重复索引值,以确保在处理数据时能够保持高度的准确性与可靠性。

二、随机数的安全和非安全

当我们谈及Random类的使用时,其实蕴含了两种截然不同的方法路径:安全的与非安全的。那么,这两者的界定究竟是什么呢?接下来,让我们一同深入探索,揭开这其中的奥秘。 首先,要理解“安全”与“非安全”的概念,我们需从它们的核心差异出发。在安全的方法中,通常会有更为严格的随机性保障和防篡改机制,确保生成的随机数具有高度的不可预测性和随机性,从而在各种应用场景下都能提供可靠的安全保障。 而相对而言,非安全的方法可能在随机性的保障上稍显逊色,可能更容易受到某些外部因素的影响,导致生成的随机数不够随机,甚至可能被预测或篡改。

三、方法参数介绍

dev_prokit 提供的 RandomList 支持 boolintdouble 三种类型的数组生成。 其详细的方法和参数介绍如下 :

  • nextBool(int length,{int? seed})

    生成布尔值类型的数组, 参数介绍:

    • length : 生成数组的长度
    • seed : 生成随机数的种子
  • secureNextBool(int length)

    安全模式生成布尔值类型的数组, 参数介绍:

    • length : 生成数组的长度
  • nextInt(int length, {int? seed, int? max, int start = 0, bool repeat = true })

    生成 Int 值类型的数组, 参数介绍:

    • length : 生成数组的长度
    • seed : 生成随机数的种子
    • max : 随机数的最大值,其值的范围是 0 <= value < max
    • start : 随机值的起始范围值, 其值的范围是 start <= value < start + max
    • repeat : 生成的随机数是否重复。
  • secureNextInt(int length, {int? max, int start = 0, bool repeat = true }) 安全模式生成 Int 值类型的数组, 参数介绍:

    • length : 生成数组的长度
    • max : 随机数的最大值,其值的范围是 0 <= value < max
    • start : 随机值的起始范围值, 其值的范围是 start <= value < start + max
    • repeat : 生成的随机数是否重复。
  • nextDouble(int length, {int? max, int? seed, int start = 0, bool repeat = true })

    生成 Double 值类型的数组, 参数介绍:

    • length : 生成数组的长度,
    • seed : 生成随机数的种子,
    • max : 随机数的最大值,其值的范围是 0 <= value < max
    • start : 随机值的起始范围值, 其值的范围是 start <= value < start + max
    • repeat : 生成的随机数是否重复。
  • secureNextDouble(int length, {int? max, int start = 0, bool repeat = true })

    安全模式生成 Double 值类型的数组, 参数介绍:

    • length : 生成数组的长度,

    • max : 随机数的最大值,其值的范围是 0 <= value < max

    • start : 随机值的起始范围值, 其值的范围是 start <= value < start + max

    • repeat : 生成的随机数是否重复。

四、小试牛刀

  • bool 类型数组
RandomList.nextBool(3), // [false, true, true]
RandomList.nextBool(3, seed: 1), // [false, true, false]

// 使用 seed 之后下次再次生成的随机结果和上次相同, 再次调用:
RandomList.nextBool(3, seed: 1), // [false, true, false]

RandomList.secureNextBool(2); // [true, false]
  • int 类型数组
// 不设置 max
// 其取值范围是 0 <= value < 5; 输出结果为: [4, 4, 3, 2, 1]
RandomList.nextInt(5);  

// 设置 max
// 其取值范围是 0 <= value < 6; 输出结果为: [1, 3, 4, 2, 5]
// 注意: length <= max
RandomList.nextInt(5, max:6);  

// 设置 start
// 其取值范围是 5 <= value < 11; 输出结果为: [8, 7, 9, 6, 8]
// 注意: length <= max
RandomList.nextInt(5, max:6, start:5);  

// 设置 seed
// [8,6,10,10,9]
RandomList.nextInt(5, max:6, start:5, seed:2);  
// 设置 seed 之后生成的随机数,在下次再次调用时,生成的结果和上次相同。
// [8,6,10,10,9]
RandomList.nextInt(5, max:6, start:5, seed:2);  

// 随机数是否重复
// [6, 5, 10, 9, 7]
RandomList.nextInt(5, max: 6, start: 5, repeat: false);


RandomList.secureNextInt(5, max:6, start:5);  // [8,6,10,10,9]
  • double 类型数组
// 不设置 max
// [0.5977280537211054, 0.6109972248356862, 0.2885383019995692]
RandomList.nextDouble(3); 

// 设置 max
// [0.2868694228030033, 2.1083113572595162, 0.5984247453274796]
RandomList.nextDouble(3, max: 2.5); 

// 设置 start
//[2.7120537418076114, 3.6471079832978655, 3.9799251738881054]
RandomList.nextDouble(3, max: 2.5, start: 2); 

// 设置 seed
// 第一次调用
// [2.001958980773398, 2.9080150379750913, 2.7173759606318324]
RandomList.nextDouble(3, max: 2.5, start: 2, seed: 2);
// 第二次调用
// [2.001958980773398, 2.9080150379750913, 2.7173759606318324]
RandomList.nextDouble(3, max: 2.5, start: 2, seed: 2);

// 随机数是否重复
// [2.001958980773398, 2.9080150379750913, 2.7173759606318324]
RandomList.nextDouble(3, max: 2.5, start: 2, seed: 2, repeat: false)

// [2.650031024041975, 4.397284067594666, 3.3972238513654016]
RandomList.secureNextDouble(3, max: 2.5, start: 2, repeat: false) 

五、鼓励与支持

这便是 dev_prokit 提供的方法之一。以编写代码较少、功能完善、代码运行强壮、支持面广等形式来开发 dev_prokit 包。 如果你有 Idea 或者 Opinion ,那请你点击此处 》》Idea & Opinion《《 把它留下吧!如果你在使用该功能后感觉还可以,它能够给你的项目开发带来便捷,那请你为之点个⭐️ dev_prokit ⭐️ 吧!分享给更多需要它的开发者。

转载自:https://juejin.cn/post/7378363694940373002
评论
请登录