我有一个存储请求的应用程序。
我在几毫秒的时间内收到多个请求。
我正在创建一个像
这样的唯一IDRandom _r = new Random();
int n = _r.Next(9);
String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, n.ToString());
但是当多个请求在毫秒的时间跨度上出现时。这个UniqueID正在重复。
我正在使用一个唯一ID存储这些请求。但如果请求在毫秒的时间跨度上进行,它会重复出现
请帮我解决这个问题....如果我在任何地方都错了,请在某处向我推荐..
答案 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());
}
}