【问题标题】:How to generate a random number with 8 digits total in C#? (4 integer, 4 fractional part)如何在 C# 中生成一个总共 8 位的随机数? (4 个整数,4 个小数部分)
【发布时间】:2012-05-01 09:05:02
【问题描述】:

类似这样的:

1234.5678
2345.6789
3456.7890

但不是:

123.4567

现在我这样做:

double number = Math.Ceiling ( random.NextDouble ( ) * 10000000 ) * 0.001;

但这并不总是给我 8 位数字。

有什么巧妙的技巧可以做到这一点?

【问题讨论】:

  • 鉴于绝大多数小数在存储为双精度时没有精确表示,因此您确实应该使用 Decimal 类型。
  • 均匀分布很重要吗?
  • @spender:你是什么意思?我只是将它们用作其他随机功能的播种机。这效率不高吗?
  • 您要解决的问题是基于数字的十进制表示的问题。双精度数据类型不将其值存储为小数。它存储为二进制尾数和指数。使用这种表示可以完美表示的数字集与使用十进制表示可以完美存储的数字集是不同的。
  • 来自en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary - 1/10 没有有限的二进制表示,这导致 10 × 0.1 在浮点运算中不精确等于 1。

标签: c# .net math random


【解决方案1】:

生成 8 个单个随机数字,然后将它们连接在一起。

【讨论】:

  • 需要一个解析步骤。慢。
  • @Servy 只要第一个数字在 1 到 9 之间,您应该得到相同的分布。组合数字为您提供9 * 10 * 10 * 10 * 10 * 10 * 10 * 10 == 9E8 可能的结果,选择 1E8 和 1E9 - 1 之间的数字为您提供1E9 - 1E8 == 9E8 可能的结果。
【解决方案2】:

使用以下之一:

double number = Math.Ceiling(random.NextDouble() * 9000 * 10000 + 1000 * 10000) * 0.0001;
double number = Math.Ceiling(random.NextDouble() * 90000000 + 10000000) * 0.0001;
double number = random.Next(10000 * 10000 / 10, 10000 * 10000) / 10000d;
double number = random.Next(10000000, 100000000) / 10000d;

【讨论】:

    【解决方案3】:
    double number = random.Next(1000 * 1000, 1000 * 1000 * 10) / 1000.0
    

    【讨论】:

      【解决方案4】:

      试试random.Next(10000000, 99999999+1) / 10000.0d;

      编辑:添加更多 9s

      EDIT2:修复了 1 减号问题

      EDIT3:添加了更多的 0,我的答案是如何获得这么多好评的?

      【讨论】:

      • var n = random.Next(min, max) 生成一个 min
      • 为了便于阅读,我建议使用 10 * 1000 * 1000100 * 1000 * 1000 之类的东西,而不是重复 0 和 9 的广告。
      • @JoanVenge 1 减问题是您指定的范围的上限是排他性的。换句话说,Random.Next(10, 99) 返回一个介于 10 和 98 之间的整数。获取随机 2 位整数的正确调用是 Random.Next(10, 100)
      • 另外,应该是 10000d,而不是 1000。
      • 这似乎为整数部分生成了比 4 更多的数字。你能查一下吗?
      【解决方案5】:
      double rndNumber = new Random().NextDouble(); 
      string testNumber = (rndNumber * 99999999).ToString("0000.0000"); 
      

      【讨论】:

        【解决方案6】:

        这样的?

        Random r = new Random();
        var item = r.Next(10000000, 100000000) * 0.0001m;
        

        下面每个消费者的评论...解释为什么我在这里使用小数:

        1. Jon Skeet 公开羞辱了我们中的许多人,因为他在俄亥俄州 Codemash 的一次演讲中选择了替补。
        2. 时尚人士使用双人床,并且
        3. 十进制将防止因使用双精度而引起的精度问题。请记住,当您在点后面需要很多数字时,您应该使用双精度数。如果您需要较少,但需要它们来保持准确性,请使用小数。

        【讨论】:

        • 或许值得解释一下为什么您选择十进制进行此计算。
        【解决方案7】:
        double number = Double.Parse(r.Next(10000000, 99999999).ToString().Insert(4,"."));
        

        【讨论】:

          【解决方案8】:
          Random rnd = new Random();
          int num1 = rnd.Next(1000,9999);
          int num2 = rnd.Next(1000,9999);
          Console.WriteLine(num1.ToString()+"."+num2.ToString());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-04-03
            • 2014-01-16
            • 2019-08-18
            • 2016-03-11
            • 1970-01-01
            • 2013-08-29
            • 2021-10-23
            相关资源
            最近更新 更多