【问题标题】:android: generate random number without repetitionandroid:生成不重复的随机数
【发布时间】:2011-04-27 16:38:00
【问题描述】:

任何人都可以帮助我制作一种在 Android 中生成随机数而不重复的方法吗? 最大数量是:prjcts.size(); 这是我的 JSON 数组。并且返回值应该是整数。

我已经拥有的是: int i = (int)(prjcts.size() * Math.random());我投了3次方法,因为我需要3个随机生成的数字。它有效,但我不知道如何不重复。所以这三个数字彼此之间不会相同。

谢谢

【问题讨论】:

  • 在一个循环或一个运行时中没有重复或什么?
  • 我做了这个 int i = (int)(prjcts.size() * Math.random()); 3次使用不同的变量。因为我需要 3 个随机生成的数字,最大值是我的 JSON 条目的最大数量。它有效,但我不知道如何不重复。所以这三个数字彼此之间不会相同。谢谢

标签: java android


【解决方案1】:

我在你的另一个问题中提到了如何做到这一点..

List<Integer> list = new ArrayList<Integer>();
int jsonMax = prjcts.size();
for(int i = 1; i<=jsonMax; i++)
    list.add(i);

Collections.shuffle(list);

for(int i=0; i<jsonMax; i++) {
    int n = list.get(i);
    //n is a random, unique number between 1 and prjcts.size()
}

【讨论】:

  • 从不引用生成器,为什么需要它?
  • 我刚刚删除了它 - 很好。另外,感谢 Itay 的更正。
  • 小优化:将 ArrayList 的大小预设为 prjcts.size() 以避免多次分配。
【解决方案2】:

你试过只使用Math.random()吗?

只要做一些施法魔法,你就可以开始了:

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

编辑:

如果你想防止重复,你可以创建一个包含所有可能索引的列表。

int max = prjcts.size();
List<int> indices = new ArrayList<int>(max);
for(int c = 0; c < max; ++c)
{
    indices.add(c);
}

然后每次你想要一个随机索引时,只需从列表中选择一个随机项目,完成后从列表中删除它

int arrIndex = (int)((double)indices.size() * Math.random());
int randomIndex = indices.get(arrIndex);
indices.remove(arrIndex);

randomIndex 现在保证是您的 JSON 列表中从未使用过的索引。

【讨论】:

  • 是的,我以前已经这样做过:int i = (int)(prjcts.size() * Math.random());它有效,但我不知道如何不重复。所以这三个数字彼此之间不会相同。谢谢
  • 谢谢!这是我最喜欢的解决方案! :)
  • 没问题,但老实说,我不知道Collections.shuffle()。 Hahaphazard 的解决方案是做同样事情的更简洁的方法。
【解决方案3】:

获得 N 个随机数而不重复从 0 到 N-1 的一种方法是创建一个包含这 N 个数字的数组,并创建一个随机数来选择该数组的一个索引。然后从该数组中删除索引,然后继续处理 N-1 个数字,依此类推。

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 * 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;
  }
}

void Test()
{
  NoRepeatRandom nrr = new NoRepeatRandom(0, 10);
  for(int i = 0; i < 12; i++)
    System.out.println("Random number: " + nrr.GetRandom());
}

【讨论】:

    【解决方案4】:

    对于它的价值,您可以尝试使用Mersenne Twister 算法,它有一个Java 实现here。 Mersenne Twister 是一个随机数生成器,其周期为 2^19937 - 1,因此您几乎可以保证不会得到相同的随机数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2016-05-05
      相关资源
      最近更新 更多