如何在Java中无需替换

时间:2013-05-12 19:16:21

标签: java algorithm

我正在做一个程序,随机生成1-5中的3个数字。我想要它,以便在生成数字时,无法再次生成它。

就像这样,我不能得到121,只有134这样的东西

5 个答案:

答案 0 :(得分:5)

您可以将所有可能的数字放入集合中。 然后你随机“逐出”它们。

此方法类似于Knuth's shuffle,效率高于{{3}} 一种天真的检查方法 - 是否已经生成或未生成, 因为后者可能不会终止。

答案 1 :(得分:1)

1.将3个数字转换为单个3位数字。

2.收集某些集合中所有已创建的数字(设置应该没问题)

3.如果新号码已经在集合中 - 再次生成它,直到它是全新的

public static void main(String[] args) {
    final int digits = 5;
    final int toGenarate = 10;
    Set<Integer> used = new HashSet<Integer>();

    int generated = 0;
    while (generated < toGenarate) {
        int number = generate(digits);
        while (used.contains(number)) {
            number = generate(digits);
        }
        used.add(number);
        generated++;
        System.out.println(number);
    }

}

private static int generate(final int digits) {
    final Random r = new Random();
    return r.nextInt(digits) * 100 + r.nextInt(digits) * 10 + r.nextInt(digits);
}

答案 2 :(得分:1)

由于可能的结果集非常小,因此将它们全部枚举,将它们放在数据结构中,然后随机选择并删除它们是完全合理的。枚举也很简单:您正在查找可能值集的笛卡尔积,并且有许多众所周知的方法可以实现这一点,只需在搜索框中键入它即可。

答案 3 :(得分:0)

如果您只想要3个随机数,请使用伪代码:

  1. 声明3个变量r1,r2和r3
  2. r1 = getRandom(1,5)。 getRandom是一个在param 1和2之间获取随机数的函数
  3. r2 = getRandom(1,5)
  4. 而r2 = r1转到第3步
  5. r3 = getRandom(1,5)
  6. 而r1 = r3或r2 = r3转到步骤5
  7. 如果您有超过3个数字可以使用外部循环和地图

    我现在看到它在java中

    import  java.util.*;
    public class RandomSet{
    
        public static void main(String[]a){
    
    
            java.util.Random rnd = new java.util.Random ();
            final int high = 5, low = 1, ll = low - 1;
            int r1 = ll,r2 = ll,r3 = ll;
    
            r1 = rnd.nextInt(high - 1) + low;
            while(r2 == (ll) || r2 == r1){
                r2 = rnd.nextInt(high - 1) + low;
            }
            while(r3 == (ll) || r3 == r1 || r2 == r3){
                r3 = rnd.nextInt(high - 1) + low;
            }
            System.out.println("r1 " + r1 + "; r2 " + r2 + "; r3 " + r3);
            RandomSet app = new RandomSet();
            Set t = app.randomSet(5, 1, 3);
            Iterator i = t.iterator();
            System.out.println(" randomSet ");
            while(i.hasNext()){
                System.out.println(" " + i.next());
            }
        }
    
        public Set<Integer> randomSet(final int high, final int low, final int number){
            if(number > (high - low)){
                throw new RuntimeException("bad high low for number");
            }
            Map<Integer,Integer> rnds = new HashMap<Integer,Integer>();
            java.util.Random rnd = new java.util.Random ();
            int r1 = 0;
            while(rnds.size() < number){
                r1 = rnd.nextInt(high - 1) + low;
                rnds.put(r1, r1);
            }
            return rnds.keySet();
    
        }
    
    }
    

答案 4 :(得分:0)

这似乎是学生的问题,因此不会包含太多代码。

假设您有一副纸牌,并且您想要将扑克牌交给玩家。你会怎么做?你拿一副牌,洗牌,交五张牌。但是你的问题不是卡片,而是一个数字列表:

  1. 创建List<Integer>
  2. 通过将整数1到5添加到列表来初始化它。
    • 参数化:写一个以大小为参数的方法。
  3. 随机播放清单。查看Collections课程。
  4. 从列表中取3个整数并将它们添加到新列表中。看看List.remove(int)返回的内容。
    • 再次,参数化方法。
  5. 另一种不涉及改组的方法是:

    1. 创建List<Integer>
    2. 通过将整数1到5添加到列表中来初始化它。
    3. 看看第一个元素。概率为3/5,使用它。
    4. 看下一个元素。有2个或3个开放插槽,还有4个数字。有可能的是开放槽的数量除以剩余整数的数量,接受这个元素。
    5. 重复下一个元素;有1个,2个或3个开放式插槽,剩下3个数字。概率为1/3。 2/3或3/3,接受此元素。
    6. 使用笔和纸验证列表中的任何整数是以3/5的概率选择的。