【问题标题】:How to create in Android Java a random number between min and max excluding some numbers that fall between min and max.?如何在Android Java中创建一个介于最小值和最大值之间的随机数,不包括一些介于最小值和最大值之间的数字?
【发布时间】:2011-12-04 22:34:25
【问题描述】:

如何在 Android Java 中创建一个介于 min 和 max 之间的随机数,不包括一些介于 min 和 max 之间的数字?

我有三个变量,每个变量都是 1-100 之间的随机数。我能够使用 math.rand() 来做随机数,但我试图确保这三个数字不匹配。我做了一个使用while和if语句的工作,但我想看看是否有一行命令可以做到这一点,这样我就可以把它放在活动类下面,让它成为公共变量。在那个区域(活动)我不能使用 while 和 if 语句,由于 void 或其他原因,我只能在 onCreate 中使用。

提前感谢您的帮助,并将投票支持任何有助于找到任何相关信息的帮助或想法。

【问题讨论】:

  • 看看这个post它描述了你想要做什么。

标签: java android random public


【解决方案1】:

不需要“一行命令”。您可以使用构造函数或初始化程序块来做任何您想做的事情。

public class blah
{
    public int a, b, c;

    // this runs when the object is created
    {
        Random r = new Random();
        a = r.nextInt(100) + 1;
        do { b = r.nextInt(100) + 1; } while (a == b);
        do { c = r.nextInt(100) + 1; } while (a == c || b == c);
    }
}

当然,您也可以将这些东西放入构造函数中——事实上,这几乎就是 Java 看到它时所做的事情。甚至像public int x = 1; 这样的初始化内容实际上也进入了构造函数。将它放在构造函数中的唯一缺点是,您需要将其添加到每个构造函数中,而如果您使用初始化程序(块或单个语句),Java 会为您完成。

【讨论】:

  • 谢谢,简洁明了。
【解决方案2】:

所有这些软件程序本质上都是伪随机数生成器,而不是真正的随机数生成器。因此,在某些角落/偏远的情况下,您最终可能会获得连续生成的相同随机数。因此,除了放置 while 循环/if else 块来处理这种极端情况外,别无选择。所以我认为你已经在做正确的理想事情,while 循环/if else 块不应该成为问题,因为随机数冲突将是罕见的情况。

【讨论】:

    【解决方案3】:

    必须通过一些条件表达式(if、while、do-while 等)来完成,因为必须“检查”生成的数字以查看它们是否相等。

    如果变量是静态的,你应该在静态构造子句中初始化它们:

    public class MyClass {
        public static final int a, b, c;
    
        static {
            // generate the random numbers here //
        }
    }
    

    如果它们不是静态的,您可以在活动的 OnCreate 方法中初始化它们。如果在activity被调用或者被标记为final之前使用它们,你应该在activity的构造函数中初始化它们。

    【讨论】:

      【解决方案4】:

      这是我的 AndroidActivity 代码,它可以工作。

      package com.androidbook.droid1;
      import java.util.Random;
      import android.app.Activity;
      import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.widget.TextView;
      public class DroidActivity3 extends Activity
      {
      public static class GetThreeRandomIntClass
      {
          public static class Dots 
          { 
              public int a; 
              public int b; 
              public int c; 
      
              public Dots()
              {
                      a = 0;
                      b = 0;
                      c = 0;
              }
      
              @Override
              public String toString()
              {
                  return "[" + a + "]" + "[" + b + "]" + "[" + c + "]";
              }
          }
      
          public static void getThreeRandomInt(Dots d)
          {
              int[] arr = new int[100];
              Random r = new Random();
              for(int i=0; i<arr.length ; i++){
                  arr[i] = i + 1;
              }
              int randInt = r.nextInt(100);
              d.a = arr[randInt];
              for(int i=randInt; i<arr.length - 1 ; i++){
                  arr[i] = arr[i + 1];
              }
              randInt = r.nextInt(99);
              d.b = arr[randInt];
              for(int i=randInt; i<arr.length - 2 ; i++){
                  arr[i] = arr[i + 1];
              }
              randInt = r.nextInt(98);
              d.c = arr[randInt];
          }
      }
      
      
      
      
      @Override
      protected void onCreate(Bundle savedInstanceState)
      {
      
          this.setContentView(R.layout.third);
      
          GetThreeRandomIntClass.Dots d = new GetThreeRandomIntClass.Dots();
          GetThreeRandomIntClass.getThreeRandomInt(d);
      
          TextView textView1 = (TextView) this.findViewById(R.id.textView1);
          textView1.setText(String.valueOf(d.a));
      
          TextView textView2 = (TextView) this.findViewById(R.id.textView2);
          textView2.setText(String.valueOf(d.b));
      
          TextView textView3 = (TextView) this.findViewById(R.id.textView3);
          textView3.setText(String.valueOf(d.c));
      
          super.onCreate(savedInstanceState);
      }}
      

      【讨论】:

        【解决方案5】:

        如果您想获得 3 个不同的随机整数而没有任何“if”或“while”,您可以使用 getThreeRandomInt 方法。 (我为测试创建了帮助类“Dots”,这不是必需品)

        package Random;
        

        导入静态 org.junit.Assert.*;

        导入 java.util.Random;

        导入 org.junit.Test;

        公共类 getThreeRandomInt { 公共静态类点 { 公共int a; 公共诠释 b; 公共 int c;

            public Dots()
            {
                a = 0;
                b = 0;
                c = 0;
            }
        
            @Override
            public String toString()
            {
                return "[" + a + "]" + "[" + b + "]" + "[" + c + "]";
            }
        }
        
        public static void getThreeRandomInt(Dots d)
        {
            int[] arr = new int[100];
            Random r = new Random();
            for(int i=0; i<arr.length ; i++){
                arr[i] = i + 1;
            }
            int randInt = r.nextInt(100);
            d.a = arr[randInt];
            for(int i=randInt; i<arr.length - 1 ; i++){
                arr[i] = arr[i + 1];
            }
            randInt = r.nextInt(99);
            d.b = arr[randInt];
            for(int i=randInt; i<arr.length - 2 ; i++){
                arr[i] = arr[i + 1];
            }
            randInt = r.nextInt(98);
            d.c = arr[randInt];
        }
        
        @Test
        public void test()
        {
            Dots d = new Dots();
        
            for(int i=0; i<300000; i++){
                getThreeRandomInt(d);
                assertFalse( d.a == d.b || d.a == d.c || d.b == d.c);
                //System.out.println(d.toString());
            }
        }
        

        }

        【讨论】:

        • 我在尝试您的代码时收到此错误(来自 getThreeRandomInt(d); 在底部,错误消息是:MytestActivity 类型的方法 getThreeRandomInt(MytestActivity.getThreeRandomInt.Dots) 未定义。 getThreeRandomInt
        • 我做了,请参阅下面帖子中的代码(作为最底部的答案)
        • 我添加了经过 android 测试的代码作为新答案。它正在我的 android-elmulator 上运行
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 2013-07-16
        • 2011-02-09
        • 2022-12-06
        相关资源
        最近更新 更多