这对某些人来说可能是明智的,但我正在尝试检查我的代码中是否存在任何重复值。
为了更清楚,我创建了5个变量整数,可以在创建数字后对其进行随机化。假设它们的名称为i1
,i2
,i3
,i4
,i5
。
我想运行一个循环来互相检查,以确保它们没有任何可能的重复。如果他们这样做,我将重新随机正在检查的第二个整数。 (例如if (i1 == i4) { i4.rand(); }
)这是为了确保i1
不需要针对所有先前检查的值重新检查,或者在长循环中被卡住,直到找到不同的数字。
这就是我在想的,如果它是一个完整的if else语句:if (i1 == i2)
,if (i1 == i3)
,if (i1 == i4)
,if (i1 == i5)
,if (i2 == i3)
,{ {1}},if (i2 == i4)
,if (i2 == i5)
,if (i3 == i4)
,if (i3 == i5)
我知道我可以通过创建大量if (i4 == i5)
语句来“手动”执行此操作,但是有更好的方法吗?如果我将整数限制增加到20并且我必须通过20次值检查if / else
,这可能不太可行。我知道有,但我不记得了。在Google上搜索没有任何结果(也许我正在搜索错误的关键字),这就是我在StackOverflow上的问题。
我想知道的是我该怎么做,理论明智(你如何在理论上检查重复?)。答案不一定是一个可行的功能。
如果您想使用我正在使用的编程语言创建演示代码,请使用if / else
。但我认为这些信息能够在理论上应用于许多其他编程语言,所以请随意写入Excel VBA
,javascript/jQuery
,C++
等等。发表评论!
答案 0 :(得分:4)
您正在寻找Set;
Set<Integer> hs = new HashSet<Integer>();
hs.add(i1);
if(!hs.add(i2)){
randomize(i2);
}
希望这会有所帮助。如果您有任何疑问,请与我们联系。 以上只是一个做什么的概念。
要获取代码的逻辑,它将是
Set<Integer> hs = new HashSet<Integer>();
for(int count=0; count<Array.length; count++){ // Store the data into the array and loop
dataToInsert = Array[count];
while(hs.add(dataToInsert)){
dataToInsert = randomize(dataToInsert);
}
}
答案 1 :(得分:2)
这是一种简单的方法来假设你想要在1到N的范围内生成它们的整数
从1:N生成一个整数 生成1:N-1的整数 生成1:N-2的整数 生成1:N-(k-1)
的整数现在将这些解释为您生成的整数的位置(在该数字的总可用整数集中)并构造您的实数。
Example, N = 5, k=4
3
1
2
2
i1 = 3
i2 = 1
i3 = 4 (the available integers are 2 4 5)
i4 = 5
请注意,这需要最少量的随机数生成。
答案 2 :(得分:1)
要清楚,你所尝试的是错误的做法。 理论上,检查重复项并在找到重复项时“重新随机化”,可以执行无限长时间,因为可以连续选择现有的整数。
你应该做的是构建整数集合,使得首先不会有重复。 Dennis Jaheruddin的回答是这样做的。或者,如果您有一组特定的整数可供选择(例如1-20),而您只是想要随机顺序,则应使用shuffling algorithm。无论如何,您应该首先在您的语言中搜索这些语言的现有实现,因为它几乎肯定已经完成过。
答案 3 :(得分:0)
您可以做的是循环遍历List<int>
,对于索引为x
的每个元素i
,循环list.Take(i-1).Contains(x)
并将x
替换为List<int>
新的随机数。
如果你只是想要一个相对便宜的检查,给定的bool areAllUnique = list.Count() != list.Distinct().Count()`
充满了唯一的数字,你可以做类似的事情:
{{1}}
答案 4 :(得分:0)
的伪代码:
S
。r
。r
位于S
,请转到2.否则,请转到4. Java中的示例性实现:
public static void main(String[] args)
{
System.out.println(getUniqueRandoms(5, 10));
}
public static Set<Integer> getUniqueRandoms(int howMany, int max)
{
final Set<Integer> uniqueRandoms = new HashSet<Integer>(howMany);
while (uniqueRandoms.size() < howMany)
{
uniqueRandoms.add((int) (Math.random() * max));
}
return uniqueRandoms;
}
输出:
[8, 2, 5, 6, 7]
如果你想将它们放在数组中,而不是在Set中,只需在你的Set上调用toArray()
。
答案 5 :(得分:0)
HashSet<Integer> set = new HashSet<Integer>();
for(int i = 0; i < 5; i++)
{
int x;
do
{
x = random();
}
while(!set.Add(x));
}
int i1 = set.ElementAt(0),
i2 = set.ElementAt(1),
i3 = set.ElementAt(2),
i4 = set.ElementAt(3),
i5 = set.ElementAt(4);
答案 6 :(得分:0)
我能想到的两种方式。
1:循环播放集合中的所有值,并将每个值与您添加的值进行比较。
2:创建一个简单版本的哈希映射:
var set
var map_size
create_set(n):
set <- array of size n of empty lists
map_size <- n
add_number(num_to_add):
if num_to_add not in set[num_to_add % map_size]:
add num_to_add to set[num_to_add % map_size]
return success
else:
return failure
populate_set():
loop 5 times:
i <- random_number()
while(add_number(i) == failure):
i <- random_number()
这样,每次添加一个数字时,您只需检查最多[max value of integer] / [map size]
个值,而不是检查集合中的其他所有数字。平均[number of elements in set] / [map size]
(我认为,如果我错了,请纠正我)。
答案 7 :(得分:0)
尝试
ArrayList<Integer> list = new ArrayList<Integer>();
while (list.size() < 5)
{
int i = Math.random() * max;
if (!list.contains(i))
{
list.add(i);
}
}
你将进入list
5个不同的整数。
答案 8 :(得分:0)
R
非常简单......
i <- as.integer(runif(5, 1, 10))
for(l in seq_along(i)){
while(any(i[l]==i[-l])) # checks each against all the other
i[l] <- as.integer(runif(1, 1, 10))
}
然而在R
中,函数sample
从给定的向量中选择随机元素而没有重复(即使您可以选择使用它们)
> sample(1:10, 5)
[1] 2 5 1 9 6
> sample(1:10, 5)
[1] 3 5 8 2 1
> sample(1:10, 5)
[1] 8 3 5 9 4
> sample(1:10, 5)
[1] 1 8 9 10 5