随机生成Long全范围数

随机生成Long全范围数

  • 前言
  • 实现思路
  • 主要代码
    • 分区
    • 随机生成过程
    • 案例:随机生成100个数
  • 朴素的比较
  • 总结

前言

使用自带的Random.nextLong()函数生成Long型的长整数,范围比较小,如下图。100个随机数没看见10以内的数字。所以考虑实现随机化生成大范围的长整数。
随机生产100个长整数

实现思路

以十进制位按区间随机生产

  1. Long型最大和最小数为19位,所以考虑分成38个区间,例如[0,9],[-9,-1],[10,99]…

  2. 然而,Math.random生成[0,1)之间的小数,意味着取不到区间的右端点。故增加一个区间存放每个区间的右端点的索引。

  3. 最后的区间划分为38个十进制位区间和一个特殊区间,如此就能保证可取长整数范围内的所有数。

主要代码

分区

首先划分出38个十进制位的区间,最后处理特殊区间即可

private static long[][] groupLongRange() {
    int unitCnt = 19;
    int len = unitCnt * 2 + 1;
    long[][] range = new long[len][2];
    long p = 1;
    for (int i = 0; i < unitCnt; ++i) {
        long l,r;
        long nl, nr;
        nr = -1 * p;
        if (i == 0) {
            l = 0;
            r = p * 10 - 1;
            nl = -1 * p * 10 + 1;
        } else if (i == 18) {
            l = p;
            r = Long.MAX_VALUE;
            nl = Long.MIN_VALUE;
        } else {
            l = p;
            r = p * 10 - 1;
            nl = -1 * p * 10 + 1;
        }
        range[i][0] = l; range[i][1] = r;
        range[i + unitCnt][0] = nl; range[i + unitCnt][1] = nr;
        p *= 10;
    }
    // 存储区间的末尾数字
    range[len - 1][0] = 0;
    range[len - 1][1] = len - 1;
    return range;
}

为了尽可能随机化,将生产的每个区间随机化排序,注意最后一个区间不参与排序。

/**
 * left - 排序的左起端点
 * len - 排序的子数组长度
 */
private static void randomSort(long[][] arr, int left, int len) {
    long start = System.currentTimeMillis();
    boolean[] v = new boolean[len];
    int cnt = left;
    while (cnt < len) {
        int k = (int) (left + Math.random() * len);
        if (!v[k]) {
            swap(arr, cnt, k);
            v[k] = true;
            ++cnt;
        }
    }
}

private static void swap(long[][] arr, int i, int j) {
    long t1 = arr[i][0];
    long t2 = arr[i][1];
    arr[i][0] = arr[j][0];
    arr[i][1] = arr[j][1];
    arr[j][0] = t1;
    arr[j][1] = t2;
}

随机生成过程

先随机生产数组下标,再随机生成对应下标范围内的数,二次随机。如果第一次随机到最后一个区间时,取得是右端点值。主要过程如下:

int len = range.length;
int ri = (int) (Math.random() * len);
long num = range[ri][0] + (long) (Math.random() * (range[ri][1] - range[ri][0]));
if (ri == len - 1) {
    // 因为每个区间的末尾取不到,所以设计多一个空间来存储,每个区间的末尾的下标
    num = range[(int) num][1];
}
// num 就是随机生成的长整数

案例:随机生成100个数

在这里插入图片描述
可见范围比自带随机化的要广

朴素的比较

以下是从时间维度进行对比

比较项自定义随机化内置随机化
1000007ms2ms
10000000152ms77ms
100000000014409ms7388ms

总结

自定义随机化过程耗时长,但是生成的随机数范围广

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新质生产力丨zData X 数据库一体机助力财政一体化平台全面升级

在数字化转型的大潮中&#xff0c;某财政局积极响应国家财政管理现代化的战略部署&#xff0c;启动了财政一体化平台升级改造工程。该项目旨在将财政局内部各部门及其各自独立的业务系统进行全面整合&#xff0c;构建起一个集约化的财政管理平台&#xff0c;力求通过技术创新推…

【剑指offr--C/C++】JZ31 栈的压入、弹出序列

一、题目 二、思路及代码 借助一个辅助栈来模拟入栈过程&#xff0c; ①在入栈之前先判断当前要入栈的元素是否与出栈数组当前元素相同&#xff0c; ② 如果不相同就入栈&#xff1b; ③如果相同就不用入栈了&#xff08;不入栈出栈&#xff09;&#xff0c;然后再依次取出栈的…

Redis中的复制功能(五)

心跳检测 概述 在命令传播阶段&#xff0c;从服务器默认会以每秒一次的频率&#xff0c;向主服务器发送命令: REPLCONF ACK < replication_offset >其中replication_offset是从服务器当前的复制偏移量。 发送REPLCONF ACK命令对于主从服务器有三个作用: 1.检测主从服…

python学习23:python中的列表(list)中的常用方法

列表(list)中的常用方法 1.列表中常用的方法主要有如下的方法&#xff1a; 2.代码演示主要常用的方法 查找某元素在列表内的下标索引&#xff1a;list.index(元素&#xff09; start_list [coco, xuanxuan, taotao] # 1.1 查找某元素在列表内的下标索引 index start_list…

Arcgis研究区图经纬度(南北)切换为英文字体(SN)

只在做英文论文研究区图的时候用&#xff0c;平常为了方便还是切换为中文

BigInteger 大整数 比较大小

一、以整数型礼品交易为例子 int userSend Integer.valueOf(id);int amount Integer.valueOf(amountStr);int userAccept Integer.valueOf(userIdAccept);GiftService giftService new GiftService();boolean carry1 giftService.isHavePropertyByUserIdByGiftId(userSend…

C++实现vector

目录 前言 1.成员变量 2.成员函数 2.1构造函数 2.2析构函数 2.3begin,end 2.4获取size和capacity 2.5函数重载【】 2.6扩容reserve 2.7resize 2.8insert 2.9删除 2.10尾插、尾删 3.0拷贝构造函数 3.1赋值运算符重载 前言 自主实现C中vector大部分的功能可以使我们更好的理解并使…

第二十二章 Maven

一、Maven 1. Maven 简介 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行自动化的构建和依赖管理。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思&#xff0c;约等于北京话中的老炮儿。有老炮儿在身边&#xff0c;项目经理可谓得心应手。 项…

Redis的5大常见数据类型的用法

上一篇文章我们讲了Redis的10大应用场景&#xff0c;这一篇文章就针对Redis的常用数据结构进行一个说明&#xff0c;通过示例的形式演示每一种数据结构如何使用。 当涉及Redis的数据操作时&#xff0c;不同数据类型对应的不同数据结构&#xff0c;如下就对5大常用的数据类型进行…

[每周一更]-第92期:Go项目中的限流算法

这周五在清明假期内&#xff0c;提前更新文章 很多业务会有限流的场景&#xff0c;比如活动秒杀、社区搜索查询、社区留言功能&#xff1b;保护自身系统和下游系统不被巨型流量冲垮等。 在计算机网络中&#xff0c;限流就是控制网络接口发送或接收请求的速率&#xff0c;它可防…

k8s 部署 canal 集群,RocketMQ 模式

k8s 部署 canal 集群&#xff0c;RocketMQ 模式 k8s 部署 canal 集群&#xff0c;RocketMQ 模式前提MySQLRocketMQ制作 canal-admin、canal-server 镜像 部署 zookeeper部署 canal-admin部署 canal-server测试 k8s 部署 canal 集群&#xff0c;RocketMQ 模式 前提 MySQL 开启…

idea2023.2.1 java项目-web项目创建-servlet类得创建

如何创建Java项目 1.1 方式1&#xff1a; 1.2 方式&#xff1a; 1.3 方式 如何创建web项目 方式 ----- 推荐 如何创建servlet类 复制6 中得代码 给servlet 配置一个路径 启动tomcat 成功了

Plonky2.5:在Plonky2中验证Plonky3 proof

1. 引言 Plonky2.5为QED Protocol团队主导的项目&#xff0c;定位为&#xff1a; 在Plonky2 SNARK中验证Plonky3 STARK proof。 从而实现Plonky系列的递归证明。 开源代码实现见&#xff1a; https://github.com/QEDProtocol/plonky2.5https://github.com/Plonky3/Plonky3&a…

go库x/text缺陷报告CVE-2022-32149的处理方案

#问题描述 go库 golang.org/x/text &#xff0c;注意这里不是go的源码&#xff0c; 在0.3.8版本之前存在一个缺陷(Vulnerability) 缺陷ID CVE-2022-32149 具体描述 攻击者可以通过制作一个Accept-Language报头来导致拒绝服务。 具体的原因是&#xff0c;在解析这个Accept-L…

Scala第十九章节(Actor的相关概述、Actor发送和接收消息以及WordCount案例)

Scala第十九章节 章节目标 了解Actor的相关概述掌握Actor发送和接收消息掌握WordCount案例 1. Actor介绍 Scala中的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。我们学习Scala Actor的目的主要是为后续学习Akka做准备。 1.1 Java并发编程的问题 在Java并…

如何通过ArkTS卡片的Canvas自定义绘制能力实现五子棋游戏卡片

介绍 本示例展示了如何通过ArkTS卡片的Canvas自定义绘制能力实现一个简单的五子棋游戏卡片。 使用Canvas绘制棋盘和黑白棋子的落子。通过卡片支持的点击事件进行交互&#xff0c;让用户在棋盘上进行黑白棋子的对局。通过TS的逻辑代码实现五子棋输赢判定、回退等逻辑计算&…

Linux制作C++静态库和动态库并使用示例

创建动态库&#xff1a; 编写源文件&#xff1a; // sub.h 显式调用 #include <iostream>extern "C" int sub(int a, int b);// sub.cpp #include "sub.h"int sub(int a, int b) {return a - b; }// quadrature.h 隐式调用 #include <iostream&…

dhcp中继代理

不同过路由器分配ip了&#xff0c;通过一台服务器来代替&#xff0c;路由器充当中继代理功能&#xff0c;如下图 服务器地址&#xff1a;172.10.1.1/24 配置流程&#xff1a; 1.使能dhcp功能 2.各个接口网关地址&#xff0c;配置dhcp中继功能 dhcp select relay &#xff0…

redis---位图Bitmap和位域 Bitfield

位图是字符串类型的拓展&#xff0c;可以使用一个string类型来模拟一个Bit数组。数组的下标就是偏移量&#xff0c;值只有0和1&#xff0c;也支持一些位运算&#xff0c;比如与或非&#xff0c;异或等等&#xff0c;它们的应用场景非常广泛比如可以用来记录用户的签到情况&…

MySQL之索引详细总结

索引简介 索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据结构上实现高级查法&#xff0c;这种数据结构就是索引 为什…