无重复的随机数组生成

新手上路,请多包涵

我正在尝试创建一个生成没有重复值的随机数组的东西。我已经看过其他答案,但似乎没有一个可以帮助我理解。我想不出一种方法来实际生成不包含重复项的随机数。这是我到目前为止所尝试的:

 srand(time(NULL));
int numbers [4];

for (int x=0; x!=4;x++)
{
    numbers[x] = 1 + (rand() % 4) ;
    printf("%d ", numbers[x]);
}

原文由 user3128016 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

首先 rand() 是生成随机数,但不是没有重复的。

如果你想生成一个 没有重复 的随机数组,那么 rand() 方法根本不起作用。

假设您要 生成 一个包含 1000 个数字 的数组。在最好的情况下,假设您生成了前 999 个没有重复的数字,最后想到的是 生成 最后一个数字得到这个数字的概率是 11000 ,所以这几乎要花很长时间才能生成。在实践中,只有 10 个数字会造成很大的麻烦。

最好的方法是通过递增( 或严格单调序列)生成所有数字,即 随机播放 它们。在这种情况下,不会有 重复

是一个关于如何使用 10 个数字进行操作的示例。即使有 1000 个号码,它也能 正常工作

注意:来自 Jhon Leehey答案 的随机播放功能。

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>

void shuffle(int *arr, size_t n)
{
    if (n > 1)
    {
        size_t i;
        srand(time(NULL));
        for (i = 0; i < n - 1; i++)
        {
          size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
          int t = arr[j];
          arr[j] = arr[i];
          arr[i] = t;
        }
    }
}

int main()
{
    int i;
    int arr[10];
    for (i=0; i<10; i++){
        arr[i] = i;
    }
    shuffle(arr, 10);
    for (i=0; i<10; i++){
        printf("%d ", arr[i]);
    }
}

原文由 rullof 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您想在不维护已访问索引的情况下伪随机遍历一个大空间,您应该查看我多年前为基本技术贡献的这个项目。 http://packetfactory.openwall.net/projects/ipspace/index.html

您应该能够根据您的目的对其进行调整,来源位于页面底部。

原文由 ibtaylor 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏