【问题标题】:Random number generator without repeating results [duplicate]没有重复结果的随机数生成器[重复]
【发布时间】:2013-04-26 08:11:27
【问题描述】:

如何使随机数生成器不重复数字? 我试过了,但它总是给我重复的数字

public int random(int a, int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l){
 Random generator = new Random();
 int choice = generator.nextInt(12) + 1;
 if((choice!=b)|(choice!=c)|(choice!=d)|(choice!=e)|(choice!=f)|(choice!=g)|(choice!=h)|(choice!=i)|(choice!=j)|(choice!=k)|(choice!=l)){
     a=choice;
 }
 else{
     random(a,b,c,d,e,f,g,h,i,j,k,l);


 }
 System.out.println(choice);
return a;

【问题讨论】:

  • 您到底想完成什么?你想要一个随机数生成器,就像“划掉”已经为你滚动的数字,还是你认为你所拥有的生成器不是随机的而是重复的?不是很清楚

标签: java random


【解决方案1】:

这取决于它应该在重复之前生成多少,因为如果你完全禁止所有重复,你最终必须用完。

如果您只需要几十个,请创建一个序列号数组并shuffle 它们。

如果您需要更长的序列,则需要在它们生成时记录它们,并且每当您看到重复时,请求另一个。 HashSet 在这里就可以了。

【讨论】:

    【解决方案2】:

    这是一个简单快速的解决方案。当然可能会更好:

    import java.util.*;
    
    public class RandomNumberGenerator {
    
        private ArrayList<Integer> usedNumbers;
        private Random r;
        private int maxNumber;
    
        public RandomNumberGenerator(int maxNumber) {
            r = new Random();
            usedNumbers = new ArrayList<Integer>();
            this.maxNumber = maxNumber;
        }
    
        public int next() {
            Integer res = r.nextInt(maxNumber);
            if (usedNumbers.contains(res)) {
                next();
            }
            usedNumbers.add(res);
            if (usedNumbers.size()==maxNumber) {
                usedNumbers.clear();
            }
            return res;
        }
    
    }
    

    【讨论】:

    • 你不认为你需要在“res”中捕获递归 next() 调用的结果。
    • 我已经测试过了,它可以工作。我同意这段代码不是最终的,它可能包含一些错误。正如我所写,可能有更好的解决方案。
    【解决方案3】:
    【解决方案4】:

    您想在不更换的情况下进行采样。将所有 a,b,...,l 放入大小为 12 的 List&lt;int&gt;。从列表中选择随机元素删除它们。

    【讨论】:

      【解决方案5】:

      | 或评估将检查其中任何一个!= 评估是否为真,然后继续执行a=choice

      如果您改用&amp;&amp; 评估,它会检查!= 评估中的所有 是否为假,如果其中一个为真,则跳过给你的else

      假设你将你的 int a, int b.... 编号为 1,2,...12- 因为你唯一不评估不等于的是 a,它只会到达 @987654327 @ 当它们都是 1 时。这很奇怪,看看两个 ints 是否相等只是为了让它们相等!

      上面的其他人已经就如何实际获得非重复随机数给出了很好的选择,所以我将避免重复它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 2016-03-01
        相关资源
        最近更新 更多