Loops 如何执行重复的签入代码?

Loops 如何执行重复的签入代码?,loops,Loops,对某些人来说,这可能是一个不需要动脑筋的问题,但我正在尝试检查我的代码中是否有任何重复的值 更清楚地说,我创建了5个变量整数,一旦它们被创建,它们就会随机化一个数字。假设它们的名字是i1,i2,i3,i4,i5 我想运行一个循环来互相检查,以确保它们没有任何可能的重复项。如果是,我将随机选取第二个被检查的整数。e、 g如果i1==i4{i4.rand;},这是为了确保i1不需要根据之前检查过的所有值重新检查,也不需要陷入长循环中,直到找到不同的数字 如果它是一个完整的if-else语句,我会这样

对某些人来说,这可能是一个不需要动脑筋的问题,但我正在尝试检查我的代码中是否有任何重复的值

更清楚地说,我创建了5个变量整数,一旦它们被创建,它们就会随机化一个数字。假设它们的名字是i1,i2,i3,i4,i5

我想运行一个循环来互相检查,以确保它们没有任何可能的重复项。如果是,我将随机选取第二个被检查的整数。e、 g如果i1==i4{i4.rand;},这是为了确保i1不需要根据之前检查过的所有值重新检查,也不需要陷入长循环中,直到找到不同的数字

如果它是一个完整的if-else语句,我会这样想:i1==i2,i1==i3,i1==i4,i1==i5,i2==i3,i2==i4,i2==i5,i3==i4,i3==i5,i4==i5

我知道我可以通过创建大量if/else语句手动完成,但是有更好的方法吗?如果我将整数限制增加到20,并且我必须通过20个值检查,这可能不是很可行。我知道有,但我就是不记得了。在谷歌上搜索什么也没找到,也许我搜索的关键词错了,这就是为什么我在StackOverflow问这个问题

我只想知道我是怎么做的,从理论上讲,你会怎么检查理论上的重复?。答案不一定是可行的函数


如果您想使用我用于解决此问题的编程语言(ITSCELVBA)创建演示代码。但是我认为这个信息能够应用于其他许多编程语言的理论,所以可以自由地写在JavaScript /jQuery、C++、C等。p> 您正在寻找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);
        }
     }

您可以在列表上循环,对于索引i处的每个元素x,循环while List.Takei-1.Containsx并用新的随机数替换x

但是,如果您只是想用相对便宜的方法检查给定列表是否包含唯一的数字,您可以执行以下操作:

bool areAllUnique = list.Count() != list.Distinct().Count()`
伪代码:

创建一个空集合S。 生成一个伪随机数r。 如果r在S中,则转到2。否则,请转到4。 将R添加到S。 如果仍有变量需要初始化,请转到2。 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;
}

如果你想让它们在数组中,而不是在集合中,只需调用你的集合。

这里有一个简单的方法来获取你的整数,假设你想生成介于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种我能想到的方法

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);
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]值,而不是检查集合中的所有其他数字。我想,平均[集合中的元素数]/[贴图大小],如果我的值错误,请纠正我。

试试看

ArrayList<Integer> list = new ArrayList<Integer>();

while (list.size() < 5)
{
    int i = Math.random() * max;
    if (!list.contains(i))
    {
        list.add(i);
    }
}

您将在列表中得到5个不同的整数。

要清楚,您尝试的是错误的方法。理论上,检查重复项并在发现重复项时重新随机化可能会执行无限长的时间,因为可以连续选择现有整数

您应该做的是以这样一种方式构造整数集合,即首先不会有重复的整数。丹尼斯·杰鲁丁的回答就是这样。或者,如果您有一组特定的整数可供选择,例如1-20,并且您只是希望它们以随机顺序排列,那么您应该使用。在任何情况下,您都应该首先在您的语言中搜索这些的现有实现,因为几乎可以肯定以前已经这样做了。

在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))
}

我想你指的是重复的值,不是变量。无论如何,你是如何创建随机数开始的?嗯,一个随机函数,由大多数编程语言提供-Excel VBA有Rand。如中所示,首先随机,然后检查重复。非常感谢你们让我了解如何解决这样的问题。我还有很多东西要学!为了利用这个解决方案,您可能需要使用do{randomizex}while!hs.Addx而不是当前的if块。右,一个for循环。所以我必须先把所有变量放入一个数组中。。。然后运行循环?你知道VBA的等价物是什么吗?还是这是VBA?我很困惑。是的,首先把元素放在
数组,然后在数组中循环。上面的代码是用Java编写的。这也适用于C。VBA的链接。没问题。如果这个答案对你有帮助,如果你能接受这个答案来结束这个问题,我将不胜感激。ThanksI意识到,几乎每个人的答案都是基于你刚才写的:这样一来,一开始就不会有重复。@RenoYeo实际上他们中的大多数人似乎都有相同的问题:他们选择了一个随机值,并检查它是否已经被选择,在选择真正唯一的值之前,可能会发生多次。mmm。我真正不明白的是丹尼斯的代码-范围是1:N,假设N是5。。。因此,如果生成器生成4,那么下一个可用步骤1:N-1是否会导致可能的范围仅为1-4,并且可能有机会获得第一步生成的结果的副本?选择的初始整数不一定是最终结果。我相信他指的算法是。
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))
}
> 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