生成一系列随机1和0

时间:2016-08-21 13:25:00

标签: java algorithm random

在java中生成包含1和0的长度为L(假设为1000)的N(比如50,000)随机唯一序列的最简单,最快捷的方法是什么?我需要这是一个伪随机生成器 - 给定一个种子作为输入,程序应始终导致生成相同的序列,无论它运行多少次。

这个编辑是针对这个问题的downvoters - random.nextInt()或random.nextDouble()给我一个整数或双精度值,但我需要一个1和0的序列。如果我需要一个1s和0s序列对应于random.nextInt()生成的随机整数,我需要将其转换为二进制数组吗?我需要这样做50,000次?那是50,000 * 32?我想知道是否有更快的方法。这就是这个问题的目的。

3 个答案:

答案 0 :(得分:1)

基本算法就足够了:

使用n = 50000l = 1000,碰撞率接近于零。

public static void main(String args[]) throws Exception {
    int n = 50000;
    int l = 1000;
    long seed = 0L;
    for (BitSet bitSet : createSequeces(n, l, seed)) {
        for (int i = 0; i < l; i++) {
            System.out.print(((bitSet.get(i)) ? "0" : "1"));
        }
        System.out.println();
    }
}

public static Set<BitSet> createSequeces(int n, int length, long seed ) {
    // check 2^length < n
    Set<BitSet> set = new HashSet<>();
    Random rand = new Random(seed);
    while (set.size() < n) {
        set.add(createRandom(rand, length));
    }
    return set;
}

private static BitSet createRandom(Random rand, int length) {
    BitSet secuence = new BitSet(length);
    for (int i = 0; i < length; i++) {
        secuence.set(i, rand.nextBoolean());
    }
    return secuence;
}

答案 1 :(得分:1)

您可以生成一个十六进制数字的随机字符串,[0..9,A..F]并在结尾处将字符串转换为二进制。 1,000个二进制数字是2​​50个十六进制数字。

如果您希望1,000位保证唯一,那么使用简单的隐写术会隐藏序列中的计数器。 50,000是0xC350,这是您将选择的250中的四个十六进制数字。随机选取246个十六进制数字,并插入(不替换)计数器的四个十六进制数字[0x0001 - &gt;例如,位置31,96,142和206中的0xC350。

在伪代码中:

function randomBinary(counter)

  hexString <- ""

  for i in [1..250]
    if (i = 31) hexString.append(first hex digit of counter)
    else if (i = 96) hexString.append(second hex digit of counter)
    else if (i = 142) hexString.append(third hex digit of counter)
    else if (i = 206) hexString.append(fourth hex digit of counter)
    else hexString.append(randomHexDigit())
  endfor

  return toBinary(hexString)

endfunction

如果提供的计数器是唯一的,则输出保证唯一。重复的计数器可能会产生独特的输出,但这不能保证。简单的隐写术不具有加密安全性,因此如果您需要加密安全性,请不要使用此方法。

答案 2 :(得分:0)

使用种子初始化随机生成器,然后从那里做一些简单的事情:

String myString = "";
double toDetermine = random.nextDouble();
if(toDetermine < 0.5) {
    myString+="1" }
else { 
    myString+="0"; }