2012-03-13 102 views
0

我正在做一个随机数(猜猜游戏),并且已经提出了ff。码,以产生10的一个或两个数字的数字(1或10到40):创建独特的随机数

public void generate() 
{ 
     for(int i=0; i<=1; i++) 
     { 
      for(int l=0; l<10; l++) 
      { 
       Random rdm=new Random(); 
       arr[l] = rdm.nextInt(range)+1; 

      } 
     } 
} 

然而,这种代码只答案来生成10个随机的一个或两个数字的需要。我需要让这个程序生成唯一的随机数。我怎样才能做到这一点?

抱歉更新晚了......我想与这个节目做的是,如果该数组包含重复的,重复的将具有独特的一个替代...

===== =========解决================

新的问题:

HashSet set=new HashSet(); 
    Random random=new Random(); 

    while(set.Size()<10) 
    { 
     set.add(random.nextInt(range)+1); 
    } 

    lbtest.setText(set.toString()); 
    bgen.setEnabled(false); 
    gametext.setText(""); 

按照要求通过ggrigery:

这里的更新后的代码参照ggrigery的建议。

+0

例如,您可以使用一个结构“ArrayList”来存储先前生成的数字,然后检查新数字是否在该列表中。 – twain249 2012-03-13 14:07:47

+0

另请参见[这个问题](http://stackoverflow.com/questions/4410225/creating-unique-random-numbers),它有一个几乎工作的实现。 – Ryan 2012-03-13 14:14:10

+0

“ff。code”?那是什么? – Paul 2012-03-13 14:51:05

回答

1
HashSet<Integer> set = new HashSet<Integer>(); 
    Random random = new Random(); 
    int i = 0; 

    while(set.size() < 10){ 
     set.add(random.nextInt(40) + 1); 
     i++; 
    } 

    System.out.println(set); 
    System.out.println(i); 
+0

问题:我如何显示集合(HashSet)中的元素?它是否会取代在集合中找到的重复项? – cryzone 2012-03-13 16:13:10

+1

集合本质上不能包含重复项。 Set.add()返回一个布尔值;如果元素不存在并且已添加到集合,则返回true;如果添加“失败”,则返回false。如果您为该代码添加计数器,您将看到该循环通常执行10次以上。 – ggrigery 2012-03-13 16:16:07

+1

要回答您的显示问题,请尝试'System.out.println(set)'。默认的'toString()'方法将打印出像[element1,element2,....]这样的元素。我用计数器更新了代码,尝试运行它并查看会发生什么。 – ggrigery 2012-03-13 16:17:26

0

执行数组中搜索要知道如果该值有:

private boolean isInsideArray(int randomNumber, int[] arr){ 
    for(int x = 0; x < arr.length; x++){ 
     if(arr[x] == randomNumber) return true; 

    } 
    return false; 
} 

,当你想知道一个数字是数组内就调用这个函数。

注意:这段代码没有经过测试,它只是一个例子来帮助你。也不是最优雅的解决方案,Java中有很多方法可以帮助您在不循环整个阵列的情况下完成此任务。

+1

我想你的意思是在循环之后放置'return false'。另外,如果你使用'ArrayList',你会得到'ArrayList.contains',而'ArrayList'对于这种情况要好得多。 – Ryan 2012-03-13 14:18:09

+0

哦,你是对的:)编辑! – Th0rndike 2012-03-13 14:20:06

+1

这个人只是在做功课来学习循环。同意arraylist更好,这个解决方案更适合他今天学习的东西。别担心,他会很快学习ArrayLists :) – Th0rndike 2012-03-13 14:24:36

0

设置保证独特的元素。然后你可以把结果转换成你想要的任何集合或数组。

public List<Integer> generate() { 
    Random random = new Random(); 
    Set<Integer> set = new LinkedHashSet<Integer>(); 
    for(int i = 0; i < numberCount; i++) { 
     set.add(random.nextInt(range)); 
    } 
    return new ArrayList<Integer>(set); 
} 
+0

我并不真正了解Java的结构,但我认为这将不会继续生成数字,直到有'numberCount';它只会消除重复。 – Ryan 2012-03-13 14:21:07

+0

问:此代码是否会生成10位一位或两位数的随机数? – cryzone 2012-03-13 14:45:20

+1

在发布我自己的帖子之前,我没有看到这个答案。矿是相同的概念,但我会保证该集合是在1-40(含)范围内的10个数字。 – ggrigery 2012-03-13 15:59:46

0
public void generate() { 
    Random rdm = new Random(); 
    int i = 0; 
    while (i < 10) { 
     int j = rdm.nextInt(range) + 1; 
     if (!arrayContains(j)) { 
      arr[i] = j; 
      i++; 
     } 
    } 
} 

public boolean arrayContains(int i) { 
    for (int k = 0; k < arr.length; k++) { 
     if (arr[k] == i) 
      return true; 
    } 
    return false; 
} 

这应该做的工作。虽然可以更优雅。

+0

@arkk_what这是否意味着如果(!arrayContains(j))? – cryzone 2012-03-13 14:46:28

+1

@cryzone,如果(!arrayContains(j))可以英文读为“if arrayContains(j)is not true”。 – 2012-03-13 15:22:07

5

另一种选择是使用shuffle。

List<Integer> all = new ArrayList<>(); 
for(int i=1;i<=range;i++) all.add(i); 
Collections.shuffle(all); 
List<Integer> selected = all.subList(0, 10); 

如果您正在选择每个元素,如果您丢弃重复项,则可能需要很长时间才能找到最后一个随机值。无论您选择一个还是全部元素,此方法都需要相同的时间。