选出随机数java_java – 有效地选择随机数

我有一个方法,它使用随机样本近似计算.这种方法被称为数百万次,所以非常重要的是选择随机数的过程是有效的.

我不知道javas Random().nextInt真的是多快,但是我的程序似乎没有像我想要的那样受益.

当选择随机数时,我做以下(半伪代码):

// Repeat this 300000 times

Set set = new Set();

while(set.length != 5)

set.add(randomNumber(MIN,MAX));

现在,这显然是一个糟糕的最坏情况运行时间,因为理论上的随机函数可以为永恒添加重复的数字,从而永远保持在while循环中.但是,这些数字从{0..45}中选择,所以重复的值在很大程度上是不可能的.

当我使用上述方法时,它比我的其他方法快40%,这并不近似,而是得到正确的结果.这运行了一百万次,所以我期待这种新方法比至少快50%.

对于更快的方法你有什么建议吗?或者也许你知道一个更有效的生成一组随机数的方法.

要澄清,这里有两种方法:

// Run through all combinations (1 million). This takes 5 seconds

for(int c1 = 0; c1 < deck.length; c1++){

for(int c2 = c1+1; c2 < deck.length; c2++){

for(int c3 = c2+1; c3 < deck.length; c3++){

for(int c4 = c3+1; c4 < deck.length; c4++){

for(int c5 = c4+1; c5 < deck.length; c5++){

enumeration(hands, cards, deck, c1, c2, c3, c4, c5);

}

}

}

}

}

// Approximate (300000 combinations). This takes 3 seconds

Random rand = new Random();

HashSet set = new HashSet();

int[] numbers = new int[5];

while(enumerations < 300000){

set.clear();

while(set.size() != 5){

set.add(rand.nextInt(deck.length));

}

Iterator i = set.iterator();

int n = 0;

while(i.hasNext()){

numbers[n] = i.next();

n++;

}

经过一番测试和剖析,我发现这种方法是最有效的:

Random rand = new Random();

int[] numbers = new int[5];

ArrayList list = new ArrayList();

while(enumerations < 300000){

while(list.size() != 5) {

int i = rand.nextInt(deck.length);

if(!list.contains(i)) list.add(i);

}

int index = 0;

for(int i : list){ numbers[index] = i; index++; }

enumeration(hands, cards, deck,numbers);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值