c# – 随机双数的多次迭代往往变小

c# – 随机双数的多次迭代往往变小,第1张

概述我正在创建一个股票交易模拟器,其中最后几天的交易价格作为开盘价,并在当天进行模拟. 因此,我产生的随机双数字可能在lastTradePrice的-5%和最后一个交易价格上方的5%.然而,经过大约240次迭代之后,我看到产生的双数越多越接近零. Random rand = new Random();Thread.Sleep(rand.Next(0,10));Random random = new 我正在创建一个股票交易模拟器,其中最后几天的交易价格作为开盘价,并在当天进行模拟.

因此,我产生的随机双数字可能在lastTradePrice的-5%和最后一个交易价格上方的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()获得随机种子.但它并不是真正随机的.为什么总是会产生较小的数字呢?

更新:

尽管Jon已经证明了这一趋势,但数学本身实际上还是很好的.
在范围之间获取随机双数也解释了here.

真正的问题是随机的种子.我已经遵循乔恩的建议,让所有三个价格保持相同的随机实例.这已经产生了更好的效果;价格实际上反d了.我仍在调查中,并提出建议如何改善这一点. Jon给出的链接提供了一个很好的文章,如何为每个线程生成一个随机的实例.

Btw整个project是开源的,如果你有兴趣的话. (使用WCF,浏览器中的WPF,PRISM 4.2,.NET 4.5堆栈)

transformPrices调用在一个单独的线程上发生在here.

如果我保持同一个随机的实例,会发生什么?

这是通过RandomProvIDer.GetThreadRandom()生成的.正如文中指出的:

解决方法 首先,像这样调用Thread.Sleep不是获得不同种子的好方法.最好使用每个线程的Random单个实例.查看我的 article on randomness一些建议的方法.

但是,您的代码也固有地向下偏向.假设我们从随机数生成器“随机”得到0.0和1.0,从$100开始.这将给:

>第0天:$100
>第1天:$95(-5%= $5)
>第二天:$99.75(5%= $4.75)

现在我们可以同时随机得到1.0和0.0:

>第0天:$100
>第1天:$105(5%= $5)
>第二天:$99.75(-5%= $5.25)

请注意,尽管这是“公平的”,我们在这两种情况下都是如此.如果价值增加,这意味着它可以在下一卷骰子上进一步下降,所以可以说…但是如果价值下降,那么它就不会反d回去.

编辑:为了说明“合理公平”的RNG是否仍然有可能降低价值,这里有一个控制台应用程序:

using System;class Test{    static voID Main()    {        Random random = new Random();        int under100 = 0;        for (int i = 0; i < 100; i++)        {            double price = 100;            double sum = 0;            for (int j = 0; j < 1000; j++)            {                double lowerBound = price * 0.95;                double upperBound = price * 1.05;                double sample = random.NextDouble();                sum += sample;                price = sample * (upperBound - lowerBound) + lowerBound;                            }            Console.Writeline("Average: {0:f2} Price: {1:f2}",sum / 1000,price);            if (price < 100)            {                under100++;            }        }        Console.Writeline("Samples with a final price < 100: {0}",under100);    }}

在我的机器上,“平均值”总是非常接近0.5(很少低于0.48或超过0.52),但大多数“最终价格”总是低于100-约65-70%.

总结

以上是内存溢出为你收集整理的c# – 随机双数的多次迭代往往变小全部内容,希望文章能够帮你解决c# – 随机双数的多次迭代往往变小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1260680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存