【问题标题】:I have a problem generating random numbers (C)我在生成随机数时遇到问题 (C)
【发布时间】:2019-06-04 16:13:30
【问题描述】:

我的问题是我无法确定如何确保 rand 函数不会为 2 个不同的单元格提供相同的数字,如果可以,我如何在不获取其他单元格中已经存在的数字的情况下更改它。( if(arr[j] != -1) 是因为我有其他函数用 (-1) 填充一些单元格

这是我尝试做的一个版本(所有 // 都是不同尝试的剩余部分)

void fillArr(int arr[], int n)
{
    int i,j=0;
    for (i = 0; i < n; i++)
    {
        while (arr[j] == arr[j + 2] &&j + 2<n)
        {
        //srand(time(NULL));
            if (arr[j] != -1)
            {
                if (j % 2 == 0)
                {

                    arr[j] = rand() % (N - 1);
                    if (arr[j + 2] != -1)
                        arr[j + 2] = rand() % (N - 1);
                    //arr[i] = rand() % (N - 1)-rand()%(i-1);
                    srand(time(NULL));
                }
                else
                {
                    arr[j] = rand() % (N - i);
                    arr[j + 2] = rand() % (N - 1);
                    //arr[i] = rand() % (N - 1) - rand() % (i +1);
                    //srand(time(NULL));
                }
            }
            j++;
        }
    }
}

【问题讨论】:

  • 您必须检查已分配的号码,看看新的rand() 是否与现有号码重复。显示您现在拥有的代码。
  • 因为您在正确制定需求方面存在问题。您不需要生成,而是要 shuffle 数字。
  • 随机数的范围是多少? array[10] 会用数字 0..9 填充吗?
  • 如果您没有展示需要帮助的程序,这不是 C 问题。如果您在开发算法时遇到问题,请标记问题。

标签: c arrays function random


【解决方案1】:

为什么随机数数组中不能有两个相等的数?

无论如何,如果您想阻止它,对于要添加到数组中的每个新值,从头开始迭代并检查该数字是否已经存在。如果是,则生成一个新数字并再次检查。

当然,数组中应该有足够的唯一数字(您可以在开始之前检查这一点),理论上它可能需要很长时间,但实际上这不会发生。

【讨论】:

  • 洗牌会更有效,除非值的范围相对于所需值的数量非常大。
  • @pjs 确实如此,但这在代码/描述中并不清楚。
【解决方案2】:

您不应该在每次循环迭代中重新播种 PRNG。您应该在程序开始时执行一次。

一旦您每秒多次调用srand(time(NULL)),您就会产生重复的数字序列。这在您的代码中似乎不太可能。

供参考:

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2011-05-18
    • 2023-04-02
    • 2013-10-21
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多