-1

这对某些人来说可能是显而易见的,但我正在尝试检查我的代码中是否有任何重复的值。

更清楚地说,我创建了 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), if (i2 == i4), if (i2 == i5), if (i3 == i4), if (i3 == i5),if (i4 == i5)

我知道我可以通过创建大量if / else语句来“手动”完成它,但是有没有更好的方法呢?如果我将整数限制增加到 20 并且我必须if / else通过 20 次值检查,这可能不是很可行。我知道有,但我就是想不起来。在 Google 上搜索什么都没有(也许我正在搜索错误的关键字),这就是我在 StackOverflow 上询问的原因。

我只想知道我该怎么做,理论上(理论上你将如何检查重复项?)。答案不一定需要是一个可行的功能。

如果您想使用我用于此问题的编程语言创建演示代码,它的Excel VBA. 但我认为这些信息将能够在理论上适用于许多其他编程语言,所以请随意写在javascript/jQuery, C++,C#等中。记得发表评论!

4

9 回答 9

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);
        }
     }
于 2013-07-25T17:02:45.103 回答
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

请注意,这需要最少数量的随机数生成。

于 2013-07-25T17:08:07.233 回答
1

需要明确的是,您尝试的是错误的方法。理论上,检查重复项并在找到一个时“重新随机化”,可以执行无限长的时间,因为可以连续选择现有的整数。

您应该做的是以首先没有重复的方式构造整数集合。丹尼斯贾赫鲁丁的回答就是这样做的。或者,如果您有一组特定的整数可供选择(例如 1-20),并且您只是希望它们按随机顺序排列,则应该使用洗牌算法。无论如何,您应该首先在您的语言中搜索这些的现有实现,因为几乎可以肯定之前已经完成了。

于 2013-07-25T17:28:03.460 回答
0

您可以做的是遍历and,对于index 处List<int>的每个元素,循环 while并替换为一个新的随机数。xilist.Take(i-1).Contains(x)x

但是,如果您只是想要一个相对便宜的检查给定List<int>充满唯一数字,您可以执行以下操作:

bool areAllUnique = list.Count() != list.Distinct().Count()`
于 2013-07-25T17:03:20.007 回答
0

伪代码:

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

输出:

[8, 2, 5, 6, 7]

如果您想将它们放在数组中,而不是在 Set 中,只需调用toArray()您的 Set。

于 2013-07-25T17:03:58.013 回答
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);
于 2013-07-25T17:13:51.150 回答
0

我能想到的2种方法。

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](我认为,如果我错了,请纠正我)价值观。

于 2013-07-25T17:19:28.413 回答
0

尝试

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

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

你会得到list5个不同的整数。

于 2013-07-25T17:23:32.953 回答
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
于 2013-07-25T17:43:04.983 回答