JAVA怎么生成不重复的随机数

dingzheng1989 2011-01-01 10:59:51
这个不是J2SE的Math那个随机数,是J2ME里的,但JVM的工作原理应该是一样的,所以在这里求解了。

Random random = new Random();

int random.nextInt(6);//生成0~5之间的随机整数

我想生成0~5这六个随机int,在线程里分别试过上面的方法,按概率算,连续生成的两个随机数重复的概率应该是1/6*1/6=1/36,线程运行36 次才会有一次重复,但是我线程运行的结果大让我郁闷,生成的随机数重复的太多了,有时连续重复十几次,这还是随机的么?


我又做了一点试验,发现程循环间隔越长,重复就越少,间隔越短,重复就越多。

比如Thread.sleep(10)就连续的十几次会重复,Thread.sleep(200)重复的就很少,但是我不可能为了得到不重复的随机数把线程睡眠时间拉长。

大侠们有更好的办法减少两个连续的随机数重复的概率没? 很头痛,真纠结。当然,运算最好简单点,手机内存受不了的。

能在
(int)System.currentTimeMillis()%6;//获取当前线程运行时间模六
上做点文章么??

我只剩20分了,谢谢了。
...全文
10126 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
oGanTongShenShou 2013-01-17
  • 打赏
  • 举报
回复
1.产生6个随机数,重复的概率是1/6,不是1/36;产生2个0或者2个1..的概率才是1/36,明白不? 2.程序产生的随机数几乎就是自然界的随机数,没有任何问题,我做过多次概率方面的运算都没问题,事实胜于雄辩,不用奇怪,不论是产生一个还是10000个随机数,都是随机的。但这种随机数用同一个种子会产生重复序列,总之,没有重复之前就是完完全全的随机数。
catail 2011-01-03
  • 打赏
  • 举报
回复 1
生成结果放set里面,检查set大小有无变化,无变化再生成一个
qinli 2011-01-03
  • 打赏
  • 举报
回复
贴我在javascript中生成随机字符串的方法,你直接在java中实现一变就可以了
function RandomNum(num)
{
var temp = "";
var i = 0;
for(i=0;i<num;i++)
{
var allStr = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var sp = allStr.split("");
var n = Math.round(Math.random() * sp.length);
temp = sp[n] + temp;
}
if(temp.length != num) temp = RandomNum(num);
return temp;
}
qian119110 2011-01-02
  • 打赏
  • 举报
回复
随机生成的数一个一个放进set里,不是不重复了吗?
dingzheng1989 2011-01-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]

若要人工控制不重复的话那才不叫随机数了!
[/Quote]叫不叫随机数没关系,我在乎的是怎么实现这个功能
Inhibitory 2011-01-02
  • 打赏
  • 举报
回复
import java.util.Random;

public class Test {
public static void main(String[] args) {
final int max = 6; // 用来产生在[0, max)之间的数
int prev = 0; // 保持前一个生成的随机数,利用它来让产生的随机数不与前一个数重复

Random rand = new Random(System.currentTimeMillis());
for (int i = 0; i < 100; ++i) {
int r = (rand.nextInt(max - 1) + 1 + prev) % max;
prev = r;

System.out.printf("%d%s", r, (i + 1) % 10 == 0 ? "\n" : " ");
}
}
}


通过这样的控制可以保证不与前一个数重复
输出:
5 4 0 3 2 5 1 5 2 0
5 0 2 5 3 1 5 2 3 1
3 1 3 4 2 3 0 3 2 4
5 0 3 2 4 1 4 2 5 2
3 5 1 0 5 0 3 2 1 0
5 4 0 5 1 4 3 4 1 5
2 4 5 2 0 5 1 4 0 2
1 0 3 0 4 5 2 3 2 3
2 3 4 5 0 3 4 2 0 4
1 2 1 4 0 4 2 0 1 2
Leguroky 2011-01-02
  • 打赏
  • 举报
回复
那个....连续两次重复的概率应该是1/6才对。。
c493177979 2011-01-02
  • 打赏
  • 举报
回复

/**
* @随机数组
* 生成一个由大于零的随机整数组成的数组,且数组中没有重复的值。
*
* @author
* @email
*/
import java.util.Arrays;

public class RandomArray {

/*
* 测试代码
*/
public static void main(String[] args) {
RandomArray ra = new RandomArray();
System.out.println(Arrays.toString(ra.getRandomArray(10)));
}

/**
* 将新获得的随机数与已产生的其它随机数相比较,若有重复数据,则丢弃,并重来一遍;
* 否则,将新数存入数组。
*
* @param i 数组的大小
* @return 随机数组
*/
public int[] getRandomArray(int i) {
int[] a = new int[i]; // a 随机数数组
for (int m = 0; m < i; m++) { // m 已产生的随机数个数
int temp = random();
if (m == 0)
a[0] = temp;
else {
for (int n = 0; n < m; n++) { // n 遍历已产生的随机数
if (temp == a[n]) {
temp = random();
n = -1;
}
}
a[m] = temp;
}
}
return a;
}

/**
* 随机数发生器
* 0 <= Math.random() < 1
*
* @return 1至10之间的随机整数
*/
private int random() {
return (int) (10 * Math.random() + 1);
}

}
qzxm9yzcc 2011-01-02
  • 打赏
  • 举报
回复
Random r = new Random(System.nanoTime());
maxi0804050128 2011-01-02
  • 打赏
  • 举报
回复
试一下,应该可以的.
public void test(){
try{
Vector v = new Vector();
for(int i = 0;i<10;i++){
Random random = new Random();
int k = random.nextInt(6);
if(v.contains(k)){
int j = (Integer)v.get(0);
if(j+1 <6){
v.removeAll(v);
v.add(j+1);
System.out.println(j+1);
Thread.sleep(10);
}else{
v.removeAll(v);
v.add(j-1);
System.out.println(j-1);
Thread.sleep(10);
}
}else{
v.removeAll(v);
v.add(k);
System.out.println(k);
Thread.sleep(10);
}
}
}catch(Exception ex){
ex.printStackTrace();
}
}
dingzheng1989 2011-01-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qian119110 的回复:]

随机生成的数一个一个放进set里,不是不重复了吗?
[/Quote] 不能放进set里 ,因为我随时要用的,所以才放进线程里 而且j2me里只有Vector没有set
桐桐-Dragon 2011-01-01
  • 打赏
  • 举报
回复
..................
paullbm 2011-01-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goodsun00 的回复:]
可以 把数据存数组,生成随机数存数组,下次生成 取数组检查 重复了 重新生成
[/Quote]

这样做,从原理上是没有错的。但很可能会影响性能。
goodsun00 2011-01-01
  • 打赏
  • 举报
回复
可以 把数据存数组,生成随机数存数组,下次生成 取数组检查 重复了 重新生成
Inhibitory 2011-01-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]

若要人工控制不重复的话那才不叫随机数了!
[/Quote]
  • 打赏
  • 举报
回复
若要人工控制不重复的话那才不叫随机数了!
dingzheng1989 2011-01-01
  • 打赏
  • 举报
回复
写错了 那个是 int i = random.nextInt(6); 不好意思

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧