【发布时间】: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,它们将是独一无二的。 -
不要使用
srand和rand。它们会产生非常糟糕的随机数。请改用<random>中的设施。
标签: c++ random numbers uniqueidentifier