gpt4 book ai didi

c# - 如何获得现在和之前某个时间点(例如 1 小时前)之间的随机时间?

转载 作者:太空狗 更新时间:2023-10-29 22:13:13 29 4
gpt4 key购买 nike

我正在尝试创建一个扩展方法,允许我以 TimeSpan 的形式在 Now 和一些用户请求的历史时间点之间创建一个随机时间。

例如:从现在到 1 小时前的随机时间。

所以,我想出了下面的 Random(..) 扩展方法。

我想使随机种子不是静态的,但如果我多次快速调用此方法(例如在循环中),那么我认为种子(基于时间)并不是真正随机的快速通话。真的吗? (好像是,当我查看我的结果时)

public static DateTimeOffset Random(this DateTimeOffset value, TimeSpan timeSpan)
{
var random = new Random();
DateTimeOffset minDateTime = value.Subtract(timeSpan);
int range = ((DateTime.Today - minDateTime)).Hours;
return minDateTime.AddHours(random.Next(range));
}

最佳答案

正如其他人所说,问题在于 new Random()使用当前时间形成种子,并且您多次获得相同的种子。

基本上你想创建相对较少的实例。作为Random不是线程安全的,你需要 ThreadStaticThreadLocal<T> - 后者是 .NET 4.0 的新功能。这是一个示例 StaticRandom类(使用 .NET 4.0),它允许您使用 Instance属性以获得此线程的有效实例。请注意,在类型初始化时,会从当前时间设置一个计数器。然后将其用于连续的种子。

using System;
using System.Threading;

public static class StaticRandom
{
private static int seed;

private static ThreadLocal<Random> threadLocal = new ThreadLocal<Random>
(() => new Random(Interlocked.Increment(ref seed)));

static StaticRandom()
{
seed = Environment.TickCount;
}

public static Random Instance { get { return threadLocal.Value; } }
}

然后你可以使用StaticRandom.Instance每当你需要 Random 的实例时.

现在回到最初的问题,您当前的扩展方法在做什么并不完全清楚。你为什么使用 DateTime.Today在所有?我怀疑你想要这样的东西:

public static DateTimeOffset Random(this DateTimeOffset value, TimeSpan timeSpan)
{
double seconds = timeSpan.TotalSeconds * StaticRandom.Instance.NextDouble();

// Alternatively: return value.AddSeconds(-seconds);
TimeSpan span = TimeSpan.FromSeconds(seconds);
return value - span;
}

但是,这将为您提供一个完全的随机时间 - 例如,它几乎必然会经过一毫秒。这样可以吗,还是您实际上希望它是基于原始时间跨度的精确秒数(或分钟数或小时数)?

关于c# - 如何获得现在和之前某个时间点(例如 1 小时前)之间的随机时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1952405/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com