【问题标题】:Generating Random values and Summing them to zero in VB.NET在 VB.NET 中生成随机值并将它们求和为零
【发布时间】:2012-03-19 13:34:01
【问题描述】:

我必须生成一系列随机数,比如 100,在 -1 和 1 的范围内,并按一个值缩放它们,比如 2 的平方根。之后我取这 100 个值,它们的总和 = 0。然后将该总和按另一个值缩放。检查下面的代码以了解我的意思。

Dim rand As New Random()
Dim sum As Double = 0
Dim kin As Double = 0

For j As Integer = 0 To 99
    rand.NextDouble()
    Console.WriteLine(" {0} ", (rand.NextDouble() * 2 - 1) * Math.Sqrt(2))
    sum = sum + ((rand.NextDouble() * 2 - 1) * Math.Sqrt(2))
    kin = kin + Math.Pow(sum, 2)
Next
Console.WriteLine(sum)
Console.WriteLine(kin)

我无法使总和等于 0。随机分布应该是均匀的,因此总和通常在 (-1,1) 之间为 0。 sum 和 kin 都有 100 个值。

最终,我正在尝试计算动量守恒。

【问题讨论】:

  • Just so you know the random distribution is supposed to be uniform so the summation would normally be 0 between。它应该相当接近于零,但绝不是“每次都为零”。有很好的变化,它不会完全为零。
  • 其实它求和为0的理论概率是……0。数学不好玩吗?
  • 另外,您正在生成 300 个随机数。您是否应该将 rand.NextDouble() 的结果放入变量中?
  • 我的目标是生成一系列从 -1 到 1 的统一随机数,使它们的总和为 0 或接近它的值。但是,我似乎无法获得“统一”部分。您现在可以省略 math.sqrt(2) 部分,只考虑 -1 和 1 之间的随机数之和,但是,它永远不会是统一的。

标签: .net vb.net loops random for-loop


【解决方案1】:

NextDouble 应该给你一个统一的分布。这与说所有获得的值将平均为平均值不同。

也许您看到的实际问题是 kin 的计算不正确。对于每次迭代,您都添加了sum ^ 2。对一个负数求平方总是会产生一个正数,此外,您还要在kin 中复合结果。如果您没有对kin 求和,而只是在循环之后 计算它,即kin = Math.Pow(sum, 2),那么您会看到sum 确实 趋于0 .

此外,正如 cmets 中所述,您没有正确使用生成的随机数,并且正在重复计算。以下是我推荐的修改:

Dim rand As New Random()
Dim sum As Double = 0
Dim kin As Double = 0
Dim randomValue As Double

For j As Integer = 0 To 99
    randomValue = (rand.NextDouble() * 2 - 1) * Math.Sqrt(2)
    Console.WriteLine(" {0} ", randomValue)
    sum = sum + randomValue
Next

kin = Math.Pow(sum, 2)

Console.WriteLine(sum)
Console.WriteLine(kin)

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 2018-09-19
    • 1970-01-01
    • 2020-07-16
    • 2020-08-29
    • 2017-04-17
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多