java 伪Random

Java多线程开发:为什么ThreadLocalRandom比Random更适合高并发场景? 本文深入探讨了Java多线程开发中ThreadLocalRandom相比Random在高并发场景下的优势。通过分析CAS竞争、伪共享等问题,揭示了ThreadLocalRandom如何通过线程隔离和延迟初始化提升性能,并提供了实战中的使用技巧和性能对比数据。 阅读详情

之前看了一篇文章,忘记了里面有段代码:

 public static void main(String[] arg){

        System.out.println(randomString(-229985452) + " " + randomString(-147909649));
}

private static String randomString(int i) {

        Random ran = new Random(i);
        StringBuilder sb = new StringBuilder();

        while(true)
        {
            int k = ran.nextInt(27);
            if (k == 0)
                break;

            sb.append((char)('`' + k));
        }

        return sb.toString();
    }

输出结果是: hello world

原理是java中的random是伪random,所以只要 key固定,随机出的序列是固定的。

我不想深究其中原理,我想的是把一些字符串弄出来是不是很好玩。 于是有了下面的程序,为了方便,我把数据灌入方式写在数组中。

public class RandomTest {

    private static int useSeconds = 0;
    private static final int maxTime = 400;
    private static boolean isRun = true;

    public static void main(String[] arg){

        System.out.println(randomString(-229985452) + " " + randomString(-147909649));

        int[] hello_world = {-229985452, -147909649};

        int[] i_love_you = {-2147482998,-2125808017,-2147058567};

        System.out.println(getString(hello_world));

        System.out.println(getString(i_love_you));

        // find random key
        String targetStr = "I Love You";
        findMyRandomkey(targetStr);
    }

    private static String getString(int[] keys){

        StringBuilder stringBuilder = new StringBuilder();

        for (int key : keys) {
            stringBuilder.append(randomString(key)).append(" ");
        }

        return stringBuilder.toString();
    }

    private static String randomString(int i) {

        Random ran = new Random(i);
        StringBuilder sb = new StringBuilder();

        while(true)
        {
            int k = ran.nextInt(27);
            if (k == 0)
                break;

            sb.append((char)('`' + k));
        }

        return sb.toString();
    }

    private static void findMyRandomkey(String targetStr){

        startTimer();

        String[] targetStrs = targetStr.toLowerCase().split(" ");

        StringBuilder stringBuilder = new StringBuilder("{");
        int result ;
        for(String str : targetStrs){
            byte[] e = str.getBytes();

            for(byte i=0 ;i<e.length; i++){
                e[i] -= '`';
            }


            if(Integer.MAX_VALUE != (result =findRandomkey(e))){

                stringBuilder.append(result).append(",");
            }
        }

        stringBuilder.delete(stringBuilder.length()-1, stringBuilder.length());
        stringBuilder.append("}");

        System.out.println("result keys is : " + stringBuilder.toString());

        stopTimer();
    }

    private static int findRandomkey(byte[] ints){

        int maxValue = 0;

        for (int value: ints) {

            if (maxValue < value)
                maxValue = value;
        }

        Random random;
        boolean isFind;

        for(int i = Integer.MIN_VALUE; i<Integer.MAX_VALUE; i++){

            if (isTimeOut()){
                return Integer.MAX_VALUE;
            }

            if(i== Integer.MAX_VALUE-2)
                System.out.println(i);

            random = new Random(i);
            isFind = true;

            for (byte anInt : ints) {
                if (random.nextInt(27) != anInt) {
                    isFind = false;
                    break;
                }
            }

            if(isFind && random.nextInt(27) == 0){
                return i;
            }
        }
        return Integer.MAX_VALUE;
    }

    private static void startTimer(){

        useSeconds = 0;
        new Thread(new Runnable() {
            public void run() {

                while (isRun && !isTimeOut()){

                    System.out.println(" "  + useSeconds);

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    useSeconds++;
                }
            }
        }).start();

    }

    private static void stopTimer(){
        isRun = false;
        System.out.println("共用时 " + useSeconds + " 秒");
    }

    private static boolean isTimeOut(){

        return useSeconds >= maxTime;
    }

}
从源码解析ThreadLocalRandom和Random的线程安全机制:为什么Random.nextInt(100)线程安全但性能差? 本文深入解析Java中Random和ThreadLocalRandom的线程安全机制与性能差异。通过源码分析揭示Random.nextInt(100)线程安全但性能差的原因,并对比ThreadLocalRandom的无锁设计优势。针对多线程环境提供最佳实践建议,帮助开发者根据场景选择合适的随机数生成策略。 阅读详情

相关推荐

MounRiver Studio实战:像管理个人项目一样整理沁恒MCU的EVT例程(附文件结构图)

本文详细介绍了如何使用MounRiver Studio重构沁恒MCU的EVT例程,实现工程化管理。通过分析官方EVT设计的局限性,提出标准化的目录结构和迁移步骤,帮助开发者提升代码可维护性和团队协作效率。文章还提供了MounRiver Studio的关键配置参数和常见问题排查指南,适用于沁恒MCU开发者。

weixin_33940469的博客 356

Java Random伪随机数

public static void main(String[] args) { Random r1 = new Random(1);// 种子为1 Random r2 = new Random(1);// 种子为1 Random r3 = new Random();// 随机种子 for (int i = 0; i < 100; i++) { System.out.println(r1.nextInt(10));// 取值范围[0,10)即0-9 System.out..

u014644574的博客 2116

2、瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比)

在中,我简单比较了瑞丽伯纳德对流的FTLE场,但是因为粒子追踪采用的是欧拉方法,所以精度不是很高, 因此与文献中的结果还是有些差别。下面放一张文献中的FTLE场,参数与上篇文章是一致的,Ra = 1e8;Pr = 1;本文将详细的介绍如何得到这样的图片,好吧,其实也不是很详细。总之,先展示以下我个人的结果。可以看出,上图基本上与文献是一致的,因为这里展示的是瞬时场,所以当然不可能是完全一致,至于提取的LCS结构,我在下面也会提及。本着详细介绍的原则,所以这里我很良心的从流场计算开始介绍。

ambu1230的博客 1786

String字符串 Random数字运算

介绍了Java编程语言中处理字符串的基本操作,包括String类的初始化、获取字符串信息、转换操作、替换和去除空格、判断操作、截取和分割以及使用StringBuilder类进行增删改查。首先,介绍了通过字符串常量和构造方法对String类进行初始化的两种方式。接着,详细讨论了如何使用Java提供的方法对字符串进行获取长度、获取特定位置字符、转换为字符数组、大小写转换、替换和去除空格、判断字符串特征等操作

saber的博客 1100

告别云端推理!用llama.cpp+树莓派5搭建本地AI问答机器人(完整配置流程)

本文详细介绍了如何在树莓派5上利用llama.cpp部署本地AI问答机器人,实现完全离线的智能对话。通过模型量化与格式转换技术,成功将MiniCPM-2B等大模型压缩并运行于资源受限的边缘设备,解决了隐私、延迟和成本问题,为物联网和硬件开发者提供了完整的配置流程与实践指南。

t1u2v的博客 509

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

Java随机生成字符串的4种方式

Apache Commons Lang库有一个org.apache.commons.lang.RandomStringUtils类,该类具有生成固定长度的随机字符串的方法。java.util.UUID 类可用于生成UUID, 它的static randomUUID方法返回一个32个字符的字符串。此方法与Math方法类似,即创建所有字符的超集,生成一个随机索引,并使用该索引处的字符创建最终字符串。它的方法可以生成只包含字母(随机字母)、数字(随机数字)或两者(随机字母数字)的随机字符串。

JavaBoy_XZL的博客 1万+

AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

StackOverflow 上面最流行的 7 个 Java 问题!

StackOverflow发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。这篇文章是在我们审阅了St...

磊哥聊Java 393

python全栈入门到实战【基础篇 01】Python初识:定位、优势与发展历程

本文介绍了热门编程语言Python。它是解释型高级语言,具通用、入门友好、胶水型特点,以简洁易读为设计哲学。优势包括语法简洁高效、生态庞大、跨平台、社区活跃、应用广泛、门槛低。发展历经诞生(1989-1994,吉多创建,1994年1.0发布)、成长(版本迭代,3.0发布)、崛起(Web与大数据推动)、爆发(AI浪潮助推)及持续迭代阶段。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1万+

java毕设:基于springboot的服装搭配推荐系统(springboot+layui+jq+html)1011

项目描述 基于springboot的服装搭配推荐系统: 基于天气服装搭配推荐系统为用户提供未来一周的天气预报情况,并根据预报天气和用户现有的服装进行着装搭配,以及显示未来6小时精确温度数据为用户提供更精确的天气信息便于用户在出行前对自己的着装进行调整,每日用户可以根据自己当日对系统推荐的着装搭配舒适度进行反馈,系统将根据用户的反馈对用户着装的保暖系数进行相应调整,通过多次的反馈和调整形成对用户着装的个体化和精确化的推荐。 本系统可以为用户提供以下服务: 1.未来五天的天气信息显示; 2.未来六小时内天气温度

qq_2537071370的博客 3647

沙刁代码~

一、睡眠排序 class SortUtil { public static void main(String[] args) { int[] nums = new int[]{1, 2, 34, 4, 45, 56}; sleepSort(nums); } /** * 多线程同时睡眠排序大法 * * @param nums int[] */ public static void sleepSort(i

Axin的博客 559

农业生产AI决策系统架构设计解密:数据层-模型层-应用层核心逻辑

想象一下,在一个炎热的夏日,传统农田里的农民伯伯正满头大汗地检查每一株玉米是否缺水;而几公里外的智慧农场里,一位年轻农民正在空调房里滑动手机屏幕,看着AI系统自动生成的灌溉计划——这就是农业生产AI决策系统带来的改变。本文的目的,就是要揭开这个"智能农业大脑"的面纱,详细讲解它的"身体构造"(架构设计)和"工作原理"(核心逻辑)。我们将聚焦系统最核心的三个部分:数据层(收集农田信息)、模型层(分析信息并思考决策)和应用层(将决策告诉农民)。

AI智能探索者的博客 1327

高并发情况下你还在用Random生成随机数?

不是吧,阿sir

敖丙 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java多线程环境下Random与ThreadLocalRandom的性能对比与选择策略

本文深入对比了Java多线程环境下Random与ThreadLocalRandom的性能差异。通过线上案例与基准测试揭示,在高并发场景下,共享Random实例因内部CAS竞争会导致严重性能下降,而ThreadLocalRandom通过线程本地存储彻底消除竞争,性能可提升数百倍。文章提供了清晰的选择策略:绝大多数多线程应用应首选ThreadLocalRandom。

study的专栏 466

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JAVA中的Random()

Java中存在着两种Random函数: 一、java.lang.Math.Random; 二、java.util.Random 第一种: 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。例子如下: package com.zoo.l...

霓虹深处 14万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java中random的用法详解

   java中存在两个随机函数,它们分别来自java.long.Math.random()和    java.util.Random();其中前者的适用范围比较小,完全可以被后者取代。一、java.lang.Math.random()方法的用法     ①、方法类型:           public static double random();            此方法是一个无参,dou...

wppi的博客 8万+

java random()_Java中的Random()函数

今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结:Java中存在着两种Random函数:一、java.lang.Math.Random;调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0...

weixin_33436866的博客 1万+

Java中Random为什么需要随机因子?

Random类继承关系 为什么需要随机因子? 为什么说Random是伪的?

wobushixiaobailian的博客 4653

java random函数用法_JAVA的Random类的用法详解

Random类主要用来生成随机数,本文详解介绍了Random类的用法,希望能帮到大家。Random类 (java.util)Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random...

weixin_39918084的博客 7580

java random函数原理_JAVA Random 详解

Java中存在着两种Random函数:一、java.lang.Math.Random;调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。例子如下:package IO;import java.util.Random;public class Te...

weixin_29325007的博客 4305

Java中Random详解

目录 伪随机 什么是伪随机数? Java随机数产生原理: Java中常见生成随机数的几种方式 Math.random() Random Random的两种构造方法: 种子的作用数什么? 小结 ThreadLocalRandom SecureRandom 总结 参考资料 伪随机 什么是伪随机数? 1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。 2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机。(随机这个属

南国樱花祭 6779

java中random方法取值范围_Java中的Random()函数

今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结:Java中存在着两种Random函数:一、java.lang.Math.Random;调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0...

weixin_30658827的博客 4776

Java里面Random的用法_Java中Random的用法

一、java.lang.Math.random调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。例子如下:// 案例1System.out.println("Math.random()=" + Math.random());// 结果是个doub...

weixin_39538451的博客 5052

JAVA中的Random()函数

Java中存在着两种Random函数: 一、java.lang.Math.Random;   调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。例子如下: package IO; import java.util.Random; public class TestRandom { public static void mai

slw20010213的博客 4200
上一篇: java 强引用,软引用,弱引用,虚引用
下一篇: java 写http压测
RobertLee~~~~~~~~
博客等级 码龄18年 14粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值