【问题标题】:How to select random values from a given range如何从给定范围内选择随机值
【发布时间】:2011-04-04 21:55:15
【问题描述】:

我正在尝试创建一个 android 应用程序,它将在给定范围内生成随机的一系列值(在本例中为整数)(但它们之间 NOT 相等)并以简单的方式显示它们文本视图

假设我们有范围R = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

每按一次按钮“生成”我想随机生成5个不同的结果

每个“生成”的示例:

  • 4、9、2、12、10
  • 5、1、6、8、13
  • 10、4、6、8、2
  • 等等……

编辑(现在可以使用)感谢所有帮助!

public class random extends Activity {


static final Integer[] data = new Integer[] {
    1, 2, 3, 4, 5, 6, 7, 8
    };


@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    Random r = new Random();

    Set<Integer> mySet = new HashSet<Integer>();
    while (mySet.size() < 5) {
       int idx = r.nextInt(data.length);
       mySet.add(data[idx]);
    }

    String text = "";
    for (Integer i : mySet) {
       text = text + i + ", "; 
    }
       TextView Numbers = (TextView)findViewById(R.id.shownumbers);
       Numbers.setText(text);
  }
}

【问题讨论】:

  • 在 Clojure 中:(take 5 (shuffle (range 1 14))) 现在将其与此处提出的 Java 解决方案进行比较;) 太糟糕了 Clojure 目前在 Android 上非常慢。

标签: java android random range


【解决方案1】:
Random r = new Random(<a seed number>);

Set<Integer> mySet = new HashSet<Integer>();
while (mySet.size() < 5) {
   int idx = r.nextInt(<length of your data>)
   mySet.add(data[idx]);
}

数据包含您的范围数字。

String text = "";
for (Integer i : mySet) {
   text = text + i + ", "; 
}

在您的 TextView 中设置此文本。

【讨论】:

  • 谢谢你的回答,请原谅我的新手,但我怎么能把它加入一个 android 活动并将其打印到 TextView 中?我似乎弄错了,应用程序甚至在它启动之前就强制关闭。
  • 再次感谢您的快速回复!我真的很感谢你的帮助。我已经编辑了我的原始帖子,展示了我所做的。肯定还是有问题。
【解决方案2】:

在编辑代码中:

int idx = r.nextInt();

需要改为:

int idx = r.nextInt(data.length);

因为您想从数据中选择一个随机索引。

【讨论】:

  • 那是缺少的部分!谢谢!
【解决方案3】:

如果我理解正确的话,你所有的数字都应该是唯一的。您可以使用要从中提取的范围填充列表。每次从中选择一个值时,都应将其从列表中删除,以免再次选择它。我希望这个描述足够清楚。如果没有,我会提供一些代码。

【讨论】:

    【解决方案4】:
    int low = ...;
    int high = ...;
    List<Integer> choices = new LinkedList<Integer>();
    for (int i = low; i <= high; i++) {
        choices.add(i);
    } 
    
    Collections.shuffle(choices);
    
    int[] choices = new int[] {
      choices.get(0),
      choices.get(1),
      choices.get(2),
      choices.get(3),
      choices.get(4)
    };
    

    【讨论】:

      【解决方案5】:
      final StringBuilder builder = new StringBuilder();
      final Random r = new Random(System.currentTimeMillis());
      final Set<Integer> numbers = new HashSet<Integer>();
      
      public String getRandomNumbers(int count,int min, int max)
      {
          if(count > (max - min) || (max < min))
              throw new IllegalArgumentException("There is an error with the parameters provided");
      
          builder.setLength(0); //Clear StringBuilder
          numbers.clear(); //Clear the number list
      
          int i=0;
          while( i < count )
          {
              int aRandomNumber = (r.nextInt() % max) +min;
      
              if(numbers.contains(aRandomNumber)) // If we have seen this number already
                  continue;
              else
              {
                  i++;
                  numbers.add(aRandomNumber);
                  builder.append(aRandomNumber); //Add number to string
      
                  if( i < (count-1) )
                      builder.append(", "); // Add a comma if it's not the last number
              }
          }
      
          String output = builder.toString();
          builder.setLength(0); //A polite clearing
          numbers.clear();
      
          return output;
      }
      

      【讨论】:

        【解决方案6】:
        public int[] generateSeries(){
         int[] R = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
            int [] newarray=new int[5];
        Collections.shuffle(Arrays.asList(R));
        for(int i=0;i<5;i++)
        {
          newarray[i]=R[i];
          System.out.println("values => "+R[i]);
        }
        return newarray;
        

        希望你能充分利用......

        【讨论】:

          猜你喜欢
          • 2022-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-09
          • 2020-07-14
          • 1970-01-01
          • 2017-06-27
          相关资源
          最近更新 更多