我知道之前曾经问过类似的问题,但请耐心等待。
我有一个数组:
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在生成后立即重复。这不是预期的效果。
所以基本上,只要它连续出现不止一次,我就可以重复一个数字。
答案 0 :(得分:1)
答案 1 :(得分:1)
在数组中生成随机索引。
重复,直到与上次使用的索引不同。
从数组中提取与该索引对应的值。
从头开始重复,直到您拥有所需数量的数字。
答案 2 :(得分:1)
虽然发布的答案不错并且运作良好,但有人可能对解决方案感到不满意,因为如果您生成足够长的序列,它可能会很难挂起(很难难以置信)相同的数字。
处理这个“问题”的算法,同时保留数字的分布将是:
答案 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])
这样,每个生成步骤保证不需要多于一个新的随机数,唯一不变的额外工作是单个加法和余数运算。