如何在不重复的情况下从数组中生成随机数?

时间:2016-07-28 15:59:16

标签: arrays sorting random

我知道之前曾经问过类似的问题,但请耐心等待。

我有一个数组:

int [] arr = {1,2,3,4,5,6,7,8,9};

我希望数字随机生成10次。像这样:

4,6,8,2,4,9,3,8,7

虽然重复了一些数字,但连续生成的数字不会超过一次。所以不喜欢这样:

7,3,1,8,8,2,4,9,5,6

如您所见,数字8在生成后立即重复。这不是预期的效果。

所以基本上,只要它连续出现不止一次,我就可以重复一个数字。

5 个答案:

答案 0 :(得分:1)

  • 生成随机数。
  • 将其与您生成的最后一个数字进行比较
  • 如果是相同的话;丢弃它
  • 如果不同,请将其添加到数组
  • 返回第1步,直到您有足够数字

答案 1 :(得分:1)

  1. 在数组中生成随机索引。

  2. 重复,直到与上次使用的索引不同。

  3. 从数组中提取与该索引对应的值。

  4. 从头开始重复,直到您拥有所需数量的数字。

答案 2 :(得分:1)

虽然发布的答案不错并且运作良好,但有人可能对解决方案感到不满意,因为如果您生成足够长的序列,它可能会很难挂起(很难难以置信)相同的数字。

处理这个“问题”的算法,同时保留数字的分布将是:

  • 从原始数组中选择一个随机数,我们称之为 n ,然后输出。
  • 制作所有元素的数组,但 n
  • 从较短的数组生成随机索引。使用 n 交换索引上的元素。输出 n
  • 重复最后一步,直到输出足够的数字。

答案 3 :(得分:0)

    int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int[] result = new int[10];
    int previousChoice = -1;

    int i = 0;
    while (i < 10) {
        int randomIndex = (int) (Math.random() * arr.length);
        if (arr[randomIndex] != previousChoice) {
            result[i] = arr[randomIndex];
            i++;
        }
    }

答案 4 :(得分:0)

到目前为止给出的解决方案都涉及每代非常规的工作;如果你反复生成索引并测试重复,你可以想象在最终得到一个新索引之前多次生成相同的索引。 (例外是Kiraa's answer,但是这个例子涉及制作部分数组副本的高常量开销)

此处的最佳解决方案(假设您需要唯一索引,而不是唯一值,和/或源数组具有唯一值)是循环索引,以便始终在(低)常量时间生成新索引。

基本上,你有一个像这样的循环(使用Python语言主要是为了简洁):

# randrange(x, y) generates an int in range x to y-1 inclusive
from random import randrange

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = []
selectidx = 0
randstart = 0

for _ in range(10):  # Runs loop body 10 times
    # Generate offset from last selected index (randstart is initially 0
    # allowing any index to be selected; on subsequent loops, it's 1, preventing
    # repeated selection of last index
    offset = randrange(randstart, len(arr))
    randstart = 1

    # Add offset to last selected index and wrap so we cycle around the array
    selectidx = (selectidx + offset) % len(arr)

    # Append element at newly selected index
    result.append(arr[selectidx])

这样,每个生成步骤保证不需要多于一个新的随机数,唯一不变的额外工作是单个加法和余数运算。