随机数在多个请求以毫秒为单位出现的情况下重复



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

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

我正在创建一个唯一的ID,例如

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

但是当多个请求以毫秒的时间跨度出现时。此唯一 ID 正在重复。

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

请帮帮我....如果我在任何地方都错了,请在某个地方建议我。

您需要从例程的每次执行中引用 1 个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 个实例可保证序列中的下一个值。

请注意,在一行中仍然获得相同值的可能性与 NextmaxValue参数的大小成反比。

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

这将为您的案例生成一个唯一的 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 对象。关于随机对象的事情是它并不是真正的随机。如果您使用相同的值为其播种,它将为您提供相同的数字。因此,如果同时创建两个 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());
    }
}

相关内容

  • 没有找到相关文章

最新更新