C# 当毫秒内出现多个请求时,随机数会重复出现

C# 当毫秒内出现多个请求时,随机数会重复出现,c#,random,guid,C#,Random,Guid,我有一个存储请求的应用程序 我在毫秒的时间跨度内收到多个请求 我正在创建一个独特的ID,如 Random _r = new Random(); int n = _r.Next(9); String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString()); 但是当多个请求以毫秒的时间跨度出现时。这个独一无二的东西正在被重复 我用一个唯一的id存储这些请求。但是如果请求在毫秒的时间跨度内出现,它就会重复 请在这方面帮助我…如果我在任何

我有一个存储请求的应用程序

我在毫秒的时间跨度内收到多个请求

我正在创建一个独特的ID,如

Random _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
但是当多个请求以毫秒的时间跨度出现时。这个独一无二的东西正在被重复

我用一个唯一的id存储这些请求。但是如果请求在毫秒的时间跨度内出现,它就会重复


请在这方面帮助我…如果我在任何地方都错了,请建议我在某个地方。

您应该在比运行您的方法的范围更高的范围内定义和创建
\r
。然后,您的方法应该使用此
\r
实例来获取其他随机生成的数字。

您需要一个从例程每次执行中引用的
随机
实例

public class Helper
{
    Random _r = new Random();
    public string GetUniqueId()
    {
        int n = _r.Next(9);
        return String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
    }
}
当您在很短的时间间隔内实例化许多
Random
s时,就会遇到这样的问题。每个实例都以相同的种子值结束,因此它们的所有伪随机值序列都是相同的。对所有调用使用1个实例可以保证序列中的下一个值


注意,在一行中仍然获得相同值的可能性与
Next

maxValue
参数的大小成反比,这将为您的案例生成一个唯一的ID-

Random _r = new Random();
int n = _r.Next(9);
String.Format("{0}{1}", DateTime.Now.Ticks, n.ToString());
或者,对于毫秒精度,您可以使用

Random _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmssfff}{1}", DateTime.Now, n.ToString());

每次运行代码时,都会创建一个新的随机对象。关于随机对象的事情是,它不是真正随机的。如果你用同样的值给它播种,它会给你同样的数字。因此,如果同时创建两个随机对象,它们将生成相同的值,因为不带参数的Random()构造函数将当前时间用作种子。当前时间不太准确,因此在一小段时间(约15毫秒)内创建的所有Random()对象都将生成相同的数字序列,因为时间没有更改

下面是一个如何修复的示例-仅创建一次随机对象:

public class MyApp
{
    private Random _r;
    public MyApp()
    {
        this._r = new Random();
    }

    public handle_request()
    {
        int n = _r.Next(9);
        String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
    }
}

请改用GUID,如果无法使用GUID,请在格式中添加毫秒,以减少(但不是消除)重复的可能性。对于随机数,您只有9个可能的值听起来像是在循环中生成
Random r
。请确保只实例化
r
一次,并重复使用它。。。如果您试图生成唯一ID,则不应天真地生成随机值。使用guid-这就是它们的用途。抱歉,请详细说明。我没有完全理解。@user2833537当您实例化Random时,它使用当前日期和时间作为种子。当您快速连续多次实例化Random时,种子没有时间更改。此外,每次实例化Random时,它都从第一个数字开始。这是导致您连续多次获得相同数字的原因。但是,这并不能保证唯一性。返回0-8的数字是很有可能的(并且很可能是在较小的范围内)。True。我应该用不同的措辞。我将更新答案。首先为什么要使用
.Next(9)
。这九个值并不特别多。您可以使用
.Next(10000)
或其他方法。如果额外的三位数字有问题,请删除该年的前三位数字(当然,除非重要的是能够恢复该年)。可以使用format元素
{1:D4}
来确保随机数始终是四位数。请帮助我如何做..我对所有这些事情都很陌生..我将非常感谢
\r.Next(9)
永远不会返回9。