2017-04-06 87 views
3

我试图编程一个随机数发生器不会产生一次以上相同的随机数。但我无法也不知道为什么。我的代码是这样的时刻:随机数发生器无需更换?

public void printNS(){ 

    System.out.print("Numeros Numeros: "); 

    for(int i=0; i < 5 ; i++){ 
     System.out.print((int)(Math.random()*50) + ","); 
    } 

    System.out.print("; Numeros Stars: "); 

    for(int i=0; i < 2 ; i++){ 
     System.out.print((int)(Math.random()*12)+ ",");  
    } 

} 
+0

你可以使用set结构吗? – Sedrick

+4

生成真随机数比你想象的要难得多......大多数都是伪随机数。 https://www.random.org/ – brad

+0

一个简单的解决方案是存储您生成的编号,以便您可以稍后检查是否有重复。但它带有内存成本 –

回答

6

在Java 8,你可以做以下

int[] rand = new Random().ints(start, end).distinct().limit(number).toArray(); 

/详情选项看到doc

和Java 8,然后才能使用一套。产生的随机数,直到您设定的尺寸小于随机数

0

这里的期望数量:

private printStars(int loops, int factor) { 
    for(int i=0; i < loops ; i++){ 
    System.out.print((int)(Math.random()*factor) + ","); 
    } 

现在:

public void printNS(){ 
    System.out.print("Numeros Numeros: "); 
    printStars(5, 50); 
    System.out.print("; Numeros Stars: "); 
    printStars(2, 12); 

希望有所帮助。关键是:当你有重复代码时,看看那些“相同”的元素;然后将它们移动到另一种方法!

2

所以你想k不同的随机数从0n(与k < n)。

两种可能的方法:

  1. 选择k随机数,因为你已经做了,并将它们存储在一个数据结构。每次你选择一个号码,检查它是否已经包含在结构中:如果是,继续选择,直到你有一个“新”随机数。这是一个足够简单的方法,但循环可能会阻止您的应用程序。我建议使用Set是因为它存储的定义不同元素

    Set<Integer> set = new LinkedHashSet<>(); // unordered 
    while (set.size() < k){ 
        set.add((int)(Math.random()*n)); 
    } 
    System.out.println(set); 
    
  2. 创建List0n之间每隔数初始化。然后洗牌。第一个k列表中的元素是你想要的数字。

    List<Integer> list = new ArrayList<>(n); 
    for (int i = 0; i < n; i++){ 
        list.add(i); 
    } 
    Collections.shuffle(list); 
    list.subList(0, k).clear(); 
    System.out.println(list); 
    

我建议第二种方法,因为它是更干净,我不知道,虽然你的效率要求。

+0

好吧,小伙子非常感谢,看一个更多的问题是否有任何easyer方式随机生成像我一样的数字,但更简单? –

+0

你是什么意思? 'Math.random()'对我来说看起来很简单 – Oneiros