【发布时间】:2010-08-10 17:24:00
【问题描述】:
我需要生成 6 个从 1 到 37 的唯一随机数;一开始我使用了一个简单的数组映射:
private int k=6, n=37;
public int[] Results ()
{
// fill an array with numbers 1 2 3 . . . n
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)
numbers[i] = i + 1;
// draw k numbers and put them into a second array
int result[] = new int[k];
for (int i = 0; i < result.length; i++)
{
// make a random index between 0 and n - 1
int r = (int) (Math.random() * n);
// pick the element at the random location
result[i] = numbers[r];
// move the last element into the random location
numbers[r] = numbers[n - 1];
n--;
}
return result;
}
问题在于,在很多情况下,我得到了近乎均匀的分布(尤其是当我进行少于 10 次抽奖时),即:1、9、16、18、24、30 或 5、16、18、22 ,26,29
我真正需要的是一个真正的随机发生器,它可以给我这样的结果: 11,16,25,29,30,32 或 4,8,9,15,18,19 在 LESS 然后 10 抽奖。
我还看到了类似的 HashMap 实现:
import java.util.*;
public class RandomHash
{
HashMap numbers = new HashMap() ;
Random rnd_gen = new Random() ;
RandomHash()
{
for(;;)
{
int rnd_num = rnd_gen.nextInt() ;
Integer rnd_num_obj = new Integer(rnd_num) ;
if (! numbers.containsKey(rnd_num_obj) )
{
numbers.put(rnd_num_obj, rnd_num_obj) ;
/* Do whatever with the number */
break ;
} /* else loop and get another rnadom num */
} /*end for*/
}
}
问题是我目前不知道如何将随机化器和哈希图分别绑定到 6 和 32。 hashmap 会给出更混乱的结果吗?
【问题讨论】:
-
定义“真正的随机”数字,并说明为什么你得到的输出不是真正随机的。
-
什么是“非均匀”?你的意思是“不统一”吗?您需要什么发行版?