【问题标题】:C# trouble using System.Random values使用 System.Random 值的 C# 问题
【发布时间】:2013-04-10 10:22:19
【问题描述】:

我正在尝试创建随机数,然后使用我发现的这个 box muller 算法。我遇到的问题是使用 System.Random 值进行任何类型的数学运算。我不能取平方根、对数或将它们与浮点值混合。这是我的随机分布代码。想了几天也没想到什么。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        Random rand1 = new Random();
        Console.WriteLine("999 Doubles1.");
        for (int ctr = 0; ctr <= 999; ctr++)
            Console.Write("{0,8:N3}", rand1.NextDouble());
        Console.WriteLine();
        Random rand2 = new Random();
        Console.WriteLine("999 Doubles2.");
        for (int ctr = 0; ctr <= 999; ctr++)
            Console.Write("{0,8:N3}", rand2.NextDouble());
        Console.WriteLine();

        float mu = .75F;
        float sigma = .1F;

        float z1 = Math.Sqrt(-2 * Math.Log(rand1)) * Math.Sin(2 * Math.PI * rand2);
        float z2 = Math.Sqrt(-2 * Math.Log(rand1)) * Math.Cos(2 * Math.PI * rand2);
        float x1 = mu + z1 * sigma;
        float x2 = mu + z2 * sigma;
        }
    }
}

【问题讨论】:

  • 您不能取负数的平方根(除非您使用复数)。此外,您不能使用随机对象传递给需要数字的函数!
  • 您正在创建两个Random 实例,这是个坏主意。创建一个实例,多次调用NextDouble()
  • -1:没有引用编译器错误消息,让您更难看到您最觉得卡在什么地方。

标签: c# random


【解决方案1】:

使用这个:

            double double1 = rand1.NextDouble();
            double double2 = rand1.NextDouble();

            double z1 = Math.Sqrt(-2 * Math.Log(double1)) * Math.Sin(2 * Math.PI * double2);
            double z2 = Math.Sqrt(-2 * Math.Log(double1)) * Math.Cos(2 * Math.PI * double2);
            double x1 = mu + z1 * sigma;
            double x2 = mu + z2 * sigma;

【讨论】:

    【解决方案2】:

    看看这段代码:

     Math.Log(rand1)
    

    这不是尝试获取随机数的日志...它是尝试获取随机数的日志生成器。你需要这样的东西:

    double randomNumber = rand1.NextDouble();
    // Code using Math.Log(randomNumber)
    

    对随机数生成器本身执行数值运算的概念没有多大意义。

    【讨论】:

    • 我不禁想知道,如果除了 Jon 以外的其他人回答相同,他们就不会得到这么多的支持。
    • @MitchWheat 如果它让你感觉更好,那么代表上限最终会吞噬绝大多数选票。
    • @Servy 想知道 Jon 在没有每日上限的情况下会有多少声望会很有趣 :)。有什么办法吗?
    • @TimSchmelter 谢谢你的链接。难以置信:)会为您的评论投票您的答案之一,但您也达到了每日上限。真可惜:)
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多