6

有没有比以下更好的方法来生成 3 位随机数:

var now = DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture);
string my3digitrandomnumber = now.Substring(now.Length - 7, 3);

谢谢..

4

5 回答 5

21

是的 - 您当前的代码根本不是随机的。它基于系统时间。特别是,如果您同时在多个线程中使用它 - 或者甚至在同一线程中快速连续多次使用它 - 您每次都会得到相同的数字。

您应该使用Randomor RandomNumberGenerator(更安全)。

例如,一旦你有了 的实例Random,你可以使用:

int value = rng.Next(1000);
string text = value.ToString("000");

(假设您希望将数字作为文本。如果您想要一个保证为三位数的整数rng.Next(100, 1000),请使用。)

但是,有一些警告Random

  • 不想每次使用时都创建一个新实例;除非您指定种子,否则这也是基于时间的
  • 它不是线程安全的

因此,理想情况下,您可能希望每个线程一个。我关于随机性的文章对此进行了更多讨论,并提供了一些示例代码。

于 2013-01-22T18:42:05.917 回答
6
int r = (new Random()).Next(100, 1000);
于 2013-01-22T18:41:57.960 回答
4

您可以使用Random该类并调用Next(10)3 次。

于 2013-01-22T18:40:51.053 回答
2

嗯,首先,你有一个奇怪的设置,你为什么要先得到日期?

您应该使用它来获得 3 位数字(小于 1000)。

Random rand = new Random(); // <-- Make this static somewhere

const int maxValue = 999;
string number = rand.Next(maxValue + 1).ToString("D3"); 

maxValue + 1是因为参数 forRandom.Next(int)是一个排他性的上限,这意味着返回的数字将始终小于参数。它永远不可能与它相等。

于 2013-01-22T18:42:37.797 回答
-1
new Random.NextDouble() * 1000
于 2013-01-22T18:44:25.857 回答