如果多个请求以毫秒为单位,则随机数会重复

时间:2013-10-07 15:38:39

标签: c# random guid

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

我在几毫秒的时间内收到多个请求。

我正在创建一个像

这样的唯一ID
Random _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());

但是当多个请求在毫秒的时间跨度上出现时。这个UniqueID正在重复。

我正在使用一个唯一ID存储这些请求。但如果请求在毫秒的时间跨度上进行,它会重复出现

请帮我解决这个问题....如果我在任何地方都错了,请在某处向我推荐..

4 个答案:

答案 0 :(得分:2)

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

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时出现的问题。每个实例都以相同的种子值结束,因此它们的所有伪随机序列值都是相同的。对所有调用使用1个实例可保证系列中的下一个值。

请注意,连续获得相同值的可能性与maxValue的{​​{1}}参数的大小成反比。

答案 1 :(得分:0)

Yo应该在比运行方法的范围更高的范围内定义和创建_r。那么,你的方法应该使用_r的这个实例来获得其他随机生成的数字。

答案 2 :(得分:0)

这将为您的案例生成一个唯一的ID -

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

OR为毫秒精度,您可以使用

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

答案 3 :(得分:0)

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

以下是如何修复它的示例 - 只创建一次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());
    }
}