为了账号安全,请及时绑定邮箱和手机立即绑定

Java随机化字符串

Java随机化字符串

素胚勾勒不出你 2022-07-27 19:51:44
我试图在不使用任何 Random() 函数的情况下生成无意义的单词。我发现我可以使用当前时钟或鼠标坐标。我选择使用当前时钟。这是我写的代码。private final char[] charray = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};private char getRandomCharacter(){    return charray[random(charray.length)];}private int random(int value){    value =(int) System.nanoTime()% 52;    return value;}protected Randomizer(){    boolean running = true;    int count = 0;    int max = 5;    while(running){        StringBuilder sb = new StringBuilder();        int size = random(25) + random(25);        for (int i = 0; i < size; i++) {            sb.append(getRandomCharacter());        }        System.out.println("Random Line : " + sb.toString());        if (count++ == max) {            running = false;            System.out.println("All of them are random.");        }    }}public static void main(String[] args) {    new Randomizer();}我期待这样的输出:axdlMkjiIfjcmqQopv 等。但我得到这样的东西:ZNNrrrUUUUxxxxbbbhhhLLLLoooRRRRRRvvvYYYYBBBBfffI 或 JmmmPPKKKKnnnnRRBeeHHHHlllllOOOOrrrVVVVV为什么连续的太多了。nanoTime太慢了还是什么?我在此之前使用了 currentTimeMillis,但情况更糟。我想不通,也找不到任何关于如何随机使用当前时钟的来源。
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

charray通过定义asCharacter[] charray并使其成为列表,您可以获得更好的结果: 在方法List<Character> chars = Arrays.asList(charray);

中使用此列表:getRandomCharacter()


 private char getRandomCharacter(){

     Collections.shuffle(chars); // shuffle before each use 

     return chars.get(random(chars.size()));

 }

当然修复random:


private int random(int value){

    return (int) System.nanoTime()% value;

}

输出:


随机行:tjnbuxtdetulhflqnejbrblxfqqikuyyrrezzwpwpwg

随机行:mzpzjboycaqrarpsqpsqpsk 随机

行:cezkcsnhtmovmt随机行:


查看完整回答
反对 回复 2022-07-27
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

可以使用时序数据(除了其他数据)来播种随机数生成器,但使用时序数据来实现随机性并不容易。这是可能的,但可能非常慢。例如,请参阅我在此处编写的关于如何使用其他数据为安全随机实例播种的代码(H2 数据库,MathUtils.generateAlternativeSeed)。它用:

  • System.currentTimeMillis()

  • System.nanoTime()

  • 新对象().hashCode()

  • Runtime.freeMemory()、maxMemory()、totalMemory()

  • System.getProperties().toString()

  • 网络地址

  • 更多计时数据

这是为了播种一个安全的伪随机数生成器。这可以确保即使在没有任何其他运行、不知道当前时间并且没有 UI 的系统上也能获得足够的熵。

但是,如您所见,依赖时序数据是困难的,因为它取决于操作系统、方法调用之间的时间、编译器和硬件。


查看完整回答
反对 回复 2022-07-27
?
HUH函数

TA贡献1836条经验 获得超4个赞

仅使用时间是有问题的,因为它限制了您可以要求随机数的频率,并且还非常依赖于实现。


更好的方法是将时间用作种子,然后使用伪随机生成器,例如线性同余生成器。您在此答案中有更多信息。考虑到这种随机数生成器算法并不安全,并且正如 Thomas 指出的那样,如果您希望在所有系统中都使用安全的 RNG,那么仅使用时间作为种子可能还不够。


因此,您的代码可能如下所示:


    private final char[] charray = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',

        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};


private long seed;


private char getRandomCharacter() {

    return charray[random(charray.length)];

}


private int random(int value) {

    seed = (1103515245L * seed + 12345L) % 2147483648L;

    return (int)seed%value;

}


protected Randomizer() {

    boolean running = true;

    int count = 0;

    int max = 5;

    seed = System.nanoTime();

    while (running) {

        StringBuilder sb = new StringBuilder();

        int size = random(25) + random(25);

        for (int i = 0; i < size; i++) {

            sb.append(getRandomCharacter());

        }

        System.out.println("Random Line : " + sb.toString());


        if (count++ == max) {

            running = false;

            System.out.println("All of them are random.");

        }

    }

}


public static void main(String[] args) {

    new Randomizer();

}


查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信