【问题标题】:java random values that not repeat不重复的java随机值
【发布时间】:2013-02-21 21:02:09
【问题描述】:

我需要从ArrayList 中选择一些随机值,但值不能重复。使用下面的代码,我只是选择随机值,但它们可以重复。

    for (int i = 0; i < 5; i++) {

        index = random.nextInt(menuItems.size());
        HashMap<String, String> urls = new HashMap<String, String>();

        urls.put("Value", menuItems.get(index).get(KEY_URL));

        randomitems.add(urls);

    }

【问题讨论】:

  • 也许,查找“shuffle”。
  • 你知道我相信“随机”和“不重复”是相互矛盾的吗?

标签: java random duplicates


【解决方案1】:

如果您不需要按特定顺序保留menutItems,您可以简单地将其随机播放并取前 5 项:

Collections.shuffle(menuItems);
for (int i = 0; i < 5; i++) {
    HashMap<String, String> urls = new HashMap<String, String>();
    urls.put("Value", menuItems.get(i).get(KEY_URL));
    randomitems.add(urls);
}

如果您确实需要保持 menuItems 原样,您可以先复制一份。

【讨论】:

    【解决方案2】:

    是的,随机性的本质是可以再次给出相同的数字。

    要摆脱这种情况,您必须手动检查新的随机数与之前收到的随机数并扔掉所有您不想要的。

    【讨论】:

      【解决方案3】:

      复制你的列表,这样你就不会弄乱你的旧列表

      List<Object> randomList = new ArrayList<Object>(oldList);
      

      选择一个

      int index = new Random().nextInt(randomList.size());
      Object randomObj = randomList.get(index);
      randomList.remove(index);
      

      所以每次你选一个,你就不能再选那个了。

      【讨论】:

        【解决方案4】:

        我在这里回答你的问题的标题。我使用Set 来确保每个数字都是唯一的,并且我不会停止添加数字,直到它等于我想要的大小。然后我将其转换为List:

        package com.sandbox;
        
        import java.util.ArrayList;
        import java.util.HashSet;
        import java.util.List;
        import java.util.Random;
        import java.util.Set;
        
        public class Sandbox {
        
            private static final int TOTAL_NUMBERS_I_WANT = 5;
        
            public static void main(String[] args) {
                Random random = new Random();
                Set<Integer> nonRepeatingRandomNumbers = new HashSet<Integer>();
                while (nonRepeatingRandomNumbers.size() < TOTAL_NUMBERS_I_WANT) {
                    nonRepeatingRandomNumbers.add(random.nextInt());
                }
                List<Integer> result = new ArrayList<Integer>(nonRepeatingRandomNumbers);
                System.out.println(result);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-11-30
          • 1970-01-01
          • 2016-01-07
          • 1970-01-01
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 2020-12-19
          • 2012-10-31
          相关资源
          最近更新 更多