【问题标题】:Random Number is getting Repeated in case when Multiple Request Coming in Miliseconds [duplicate]当多个请求以毫秒为单位时,随机数会重复[重复]
【发布时间】:2013-10-07 15:38:38
【问题描述】:

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

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

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

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

但是当多个请求以毫秒为时间跨度时。这个 UniqueID 正在重复。

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

请帮我解决这个问题....如果我在任何地方错了,请在某个地方给我建议..

【问题讨论】:

  • 改用 GUID,如果不能使用 GUID,则在格式中添加毫秒以减少(但不消除)重复的可能性
  • 你的随机数只有 9 个可能的值
  • 听起来你正在循环生成你的Random r。确保您只实例化 r 一次,然后重复使用它。
  • musefan 的 +1... 如果您尝试生成唯一 ID,则不应天真地生成随机值。使用 guid - 这就是它们的用途。

标签: c# random guid


【解决方案1】:

您需要 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());
    }
}

当您在一个小间隔内实例化许多 Randoms 时,您会遇到问题。每个实例最终都具有相同的种子值,因此它们的所有伪随机值系列都是相同的。对所有调用使用 1 个实例可以保证系列中的下一个值。

注意,仍然连续获得相同值的可能性与NextmaxValue 参数的大小成反比。

【讨论】:

  • 对不起,请详细说明..我没有完全理解..
  • @user2833537 实例化 Random 时,它使用当前日期和时间作为种子。当您快速连续多次实例化 Random 时,种子没有时间更改。此外,每次实例化 Random 时,它都会从第一个数字开始。这就是导致您连续多次获得相同数字的原因。
  • 但这并不能保证唯一性。很有可能(并且可能在很小的范围内)会返回一个从 0 到 8 的返回数字。
  • 是的。我应该使用不同的措辞。我会更新答案。
  • 为什么首先使用.Next(9)。九个值并不是特别多。您可以使用.Next(10000) 或其他东西。如果额外的三位数字有问题,请删除年份的前三位数字(当然,除非能够恢复年份很重要)。可以使用格式元素{1:D4} 确保随机数始终为四位数。
【解决方案2】:

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

【讨论】:

  • 请帮我怎么做..我对所有这些事情都很陌生..我会非常感激
【解决方案3】:

这将为您的案例生成一个唯一 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());

【讨论】:

  • 请注意,_r.Next(9) 永远不会返回 9。
【解决方案4】:

每次运行代码时,都会创建一个新的 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());
    }
}

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多