如何在代码中执行重复检查?

时间:2013-07-25 16:58:45

标签: loops

这对某些人来说可能是明智的,但我正在尝试检查我的代码中是否存在任何重复值。

为了更清楚,我创建了5个变量整数,可以在创建数字后对其进行随机化。假设它们的名称为i1i2i3i4i5

我想运行一个循环来互相检查,以确保它们没有任何可能的重复。如果他们这样做,我将重新随机正在检查的第二个整数。 (例如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 VBAjavascript/jQueryC++等等。发表评论!

9 个答案:

答案 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)

的伪代码:

  1. 创建一个空集S
  2. 生成伪随机数r
  3. 如果r位于S,请转到2.否则,请转到4.
  4. 将R添加到S。
  5. 如果仍有要初始化的变量,请转到2.
  6. 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