【发布时间】:2023-03-27 12:41:01
【问题描述】:
我正在创建一个股票交易模拟器,其中将最后一天的交易价格作为开盘价并在当天进行模拟。
为此,我正在生成可能是 lastTradePrice 的 -5% 和 lastTradePrice 以上 5% 的随机双精度数。然而,在大约 240 次迭代之后,我看到生成的双精度数如何变得越来越小,接近于零。
Random rand = new Random();
Thread.Sleep(rand.Next(0,10));
Random random = new Random();
double lastTradeMinus5p = model.LastTradePrice - model.LastTradePrice * 0.05;
double lastTradePlus5p = model.LastTradePrice + model.LastTradePrice * 0.05;
model.LastTradePrice = random.NextDouble() * (lastTradePlus5p - lastTradeMinus5p) + lastTradeMinus5p;
如您所见,我正在尝试通过使用Thread.sleep() 来获取随机种子。然而,它并没有真正随机化。为什么会出现这种总是产生较小数字的趋势?
更新:
尽管乔恩已经证明了下降趋势,但数学本身实际上很好。 here 也解释了在范围之间获取随机双数。
真正的问题是Random 的种子。我已按照 Jon 的建议在线程中为所有三个价格保持相同的 Random 实例。这已经产生了更好的结果;价格实际上正在向上反弹。我仍在调查并接受如何改进这一点的建议。 Jon 提供的链接提供了一篇很棒的文章,如何为每个线程生成一个随机实例。
顺便说一句,如果您有兴趣,整个project 是开源。 (在浏览器中使用 WCF、WPF、PRISM 4.2、.NET 4.5 堆栈)
TransformPrices 调用发生在一个单独的线程上 here。
如果我保持相同的随机实例会发生这种情况:
正如文章中所指出的,这是通过RandomProvider.GetThreadRandom(); 生成的:
【问题讨论】:
-
这是在循环内吗?请尝试使用相同的
Random实例,不要每次都重新创建。 -
我不完全确定
Thread.Sleep(rand.Next(0,10));的确切点。另外能否请您确认一下这张图显示的是什么:random的演变或model.LastTradePrice的演变? -
model.LastTradePrice是双份吗? -
你的数学产生了这个结果,而不是随机数生成器。
-
如果增值税为 25%,我以 100 美元购买了一个苹果,我支付了多少增值税(美元)?