java 伪Random

本文介绍了一种利用Java中Random类的特性,通过固定种子来生成特定字符串的方法,并提供了一个示例程序,演示如何找到能够生成指定字符串的随机数种子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值