Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成随机1和0的序列_Java_Algorithm_Random - Fatal编程技术网

Java 生成随机1和0的序列

Java 生成随机1和0的序列,java,algorithm,random,Java,Algorithm,Random,在java中,生成长度为L(比如1000)的N(比如50000)个包含1和0的随机唯一序列的最简单、最快速的方法是什么?我需要这是一个伪随机生成器-给定一个特定的种子作为输入,程序应该总是生成相同的序列,无论它运行多少次 这个编辑是为这个问题的投票人准备的-random.nextInt()或random.nextDouble()给我一个整数或双精度值,但我需要一个1和0的序列。如果我需要一个1和0的序列,对应于从random.nextInt()生成的随机整数,我需要将其转换为二进制数组吗?我需要

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


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

基本算法就足够了:

n=50000
l=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;
}
publicstaticvoidmain(字符串args[])引发异常{
int n=50000;
int l=1000;
长种子=0L;
for(位集位集:CreateSequences(n,l,seed)){
对于(int i=0;i
使用种子初始化随机生成器,然后从那里执行以下简单操作:

String myString = "";
double toDetermine = random.nextDouble();
if(toDetermine < 0.5) {
    myString+="1" }
else { 
    myString+="0"; }
String myString=”“;
double toDetermine=random.nextDouble();
如果(toDetermine<0.5){
myString+=“1”}
否则{
myString+=“0”;}

您可以生成一个随机的十六进制数字字符串[0..9,a..F],并在末尾将该字符串转换为二进制。1000个二进制数字等于250个十六进制数字

如果您希望1000位保证唯一,则使用简单的隐写术在序列中隐藏计数器。50000是0xC350,这是您将选择的250中的四个十六进制数字。随机选取246个十六进制数字,并在位置31、96、142和206处插入(而不是替换)计数器[0x0001->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
函数随机二进制(计数器)

这是一个有趣的问题,请发布你第一次尝试!random.nextInt()或random.nextDouble()给我一个整数或双精度值,但我需要一个1和0的序列。如果我需要一个1和0的序列,对应于从random.nextInt()生成的随机整数,我需要将其转换为二进制数组吗?我需要做50000次?那是50000*32?我想知道是否有更快的方法。
random.next(1)
random.nextInt(1)
将返回0或1作为int。但是这不是很有效。最好是请求byte[]b=新字节[len/8];随机。下一字节(b);`(或者只在需要时请求它们,而不存储1000个)。整数数组也是一个位数组,如果你这样对待它的话。我将从byte[]数组构造位集(在单个操作中从Random请求),这将极大地减少调用。
BitSet.valueOf(b)
。如果长度不是8位的倍数,我会四舍五入。另外,我想知道这是否是确定性的?给定起始种子,生成的序列应相同。是,种子应在createSequence()之外进行