【问题标题】:Random number generator without repetition Class in JavaJava中无重复类的随机数生成器
【发布时间】:2013-09-17 00:53:25
【问题描述】:

首先,我是一名新手 Android 应用程序开发人员。在我的应用程序中,我需要一个在给定范围内生成随机数以避免重复的类。我已经为这个问题搜索了很多,但我还没有找到任何适合我的案例的具体解决方案。好吧,我以为我找到了一个我稍微重新适应的,但它不能正常工作。代码如下:

public class NoRepeatRandom {

  private int[] number = null;
  private int N = -1;
  private int size = 0;
  public NoRepeatRandom(int minVal, int maxVal)
  {
    N = (maxVal - minVal) + 1;
    number = new int[N];
    int n = minVal;
    for(int i = 0; i < N; i++)
      number[i] = n++;
    size = N;
  }

  public void Reset() { size = N; }

   // Returns -1 if none left
  public int GetRandom()
  {
    if(size <= 0) return -1;
    int index = size * (int)Math.random();
    int randNum = number[index];

    // Swap current value with current last, so we don't actually
    // have to remove anything, and our list still contains everything
    // if we want to reset
    number[index] = number[size-1];
    number[--size] = randNum;

    return randNum;
  }
}

当我调用 GetRandom() 时,我没有达到预期的结果,因为它总是返回给定范围的最小数字。例如:

NoRepeatRandom nrr = new NoRepeatRandom(0, 10);
int yes = nrr.GetRandom();
//Here I create a Toast just to see the numbers that the method is returning.    
Toast toast = Toast.makeText(MainActivity.this, Integer.toString(yes), Toast.LENGTH_SHORT);
toast.show();

结果是:0,0,0,0,0,0.... 对于范围 (5,10),结果是 5,5,5,5....

有人知道代码有什么问题吗?非常感谢任何帮助!

提前谢谢你。

【问题讨论】:

    标签: java android random


    【解决方案1】:

    我猜这行有问题。

    int index = size * (int) Math.random();
    

    这总是

    编辑:

    只是整合了 Jeroen Vannevel 和 OP 的 cmets。

    Math.random() 将返回一个介于 0.0 和 1.0 之间的值,当使用 (int) 进行转换时,它的计算结果总是为零。你可以如下使用。

    int index = (int) (size * Math.random());
    

    【讨论】:

    • 是的,这看起来是个问题。修复它: int index = (int)(size * Math.random());
    • 澄清一下:Math.random() 返回一个介于 0.0 和 1.0 之间的值。通过将其转换为int,您首先会忽略该期间之后的所有内容,因此您最终会得到00times 仍然是 0。
    • 是的!非常感谢,这就是问题所在。现在吐司给出了不同的数字 :) 现在的问题是给出的数字是重复的 TT 我必须重新检查代码。我得到了这个序列(对于之前编写的相同代码,添加更改:int index = (int)(size * Math.random());):7,10,6,8,0,7,8,4, 2,1,8,6,0,9(当我点击一个按钮时,通过 Toast 显示的数字,在调用 NoRepeatRandom 类的地方有一个 onclick)。
    【解决方案2】:

    您应该尝试使用Random 类:

    http://developer.android.com/reference/java/util/Random.html

    Random random = new Random();
    int randomNo = random.nextInt(10);  // 0 to 9
    

    【讨论】:

    • 我想就是这样 - Math.random() 返回 0-1,所以转换为 int 几乎总是 0
    • 是的,就是这样,Math.random() 给出 0-1 的数字。谢谢你们俩! :)
    猜你喜欢
    • 2015-06-22
    • 2018-06-25
    • 2014-03-11
    • 2018-09-14
    • 2013-11-30
    • 2012-06-29
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多