【问题标题】:Need to generate a unique 5 digit number from 00001 to 99999 in C++ [duplicate]需要在 C++ 中生成一个从 00001 到 99999 的唯一 5 位数字 [重复]
【发布时间】:2018-09-03 07:16:05
【问题描述】:

我们将修改现有菜单逻辑的一部分,为用户生成一个 ID。此用户 ID 的类型为 int,长度为 5 位。这些值是 00001 – 99999,并且在生成它们时应在显示屏上显示所有 5 位数字(前导零)。不要更改 int 的数据类型。检查 setfill 操纵器作为可能的帮助者。 Setfill 允许您使用输入参数将填充字符设置为一个值,例如“0”表示前导零。研究它,你会发现你也需要在使用后重置填充字符,否则你会在显示屏上打印很多零!您的程序还应保证为每个添加的新活动生成一个绝对唯一的用户 ID。想想这是如何工作的......

目前我一直在尝试让以下代码工作

srand(time(0));
cout << setfill('0') << setw(5) << rand() %99999 << endl;

问题在于,这似乎根本不是随机的(它只是根据计算机的内部时钟缓慢地计数,对吗?)并且第一个数字始终为零。就像说明说的那样,它应该在 00001 和 99999 之间。

编辑:我很欣赏不同的解决方案,但它们中的大多数比我应该用于这项任务的更先进。我相当确定 srand() 和 rand() 是我应该使用的。

【问题讨论】:

  • 你不能只有一个计数器,每次“生成”一个 ID 时递增计数器吗?随机的解决方案是行不通的,因为你会遇到很多冲突。描述没有提到它必须是随机的。
  • 在程序开始时调用srand()一次。然后不要再调用它。此外,如果您想要从 1 到 99999 的数字,则需要将 1 添加到 rand() %99999
  • 您应该了解 C++ random 库。它包含比rand()更灵活的随机数生成器。
  • 将您的号码填入std::set,它们将是独一无二的。
  • 不要使用srandrand。它们会产生非常糟糕的随机数。请改用&lt;random&gt; 中的设施。

标签: c++ random numbers uniqueidentifier


【解决方案1】:

好的,看来您必须使用rand() 函数来生成1-99999 之间的值。因此,考虑到这一点,以下代码应在所需范围内生成随机值:

#include <iomanip>
#include <iostream>

const int randID()
{
    return 1 + (std::rand() % (99999));
}

int main()
{   
    for(int i = 0; i < 1000; ++i)
        std::cout << std::setfill('0') << std::setw(5) << randID() << '\n';

    return 0;
}

对我来说,它会打印,例如:

01886
21975
01072
11334
22868
26154
14296
32169
20826
09677
15630
28651

这应该满足您对 1-99999 之间的 0 填充值的要求。此外,正如 cmets 中所述。请查看 &lt;random&gt; 以了解您在此分配之外的随机数需求,因为它生成的随机数要好得多,并提供更多的生成器、分布和更好的种子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多