【问题标题】:random double in four different interval四个不同区间的随机双精度
【发布时间】:2013-12-03 02:49:07
【问题描述】:

根据我的应用程序需要,我需要生成 0 到 1 范围内的数字,但需要稍作修改:

1. Range [0,1) : include 0 but not 1
2. Range (0, 1) : not include 0 nor 1
3. Range (0, 1] : same as 1. include 1 but not 0
4. Range [0,1]: include both 0 and 1

在 C# 中,我怎样才能像这样随机?

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 如果您正在创建一个double-precision 随机数,那么恰好出现 0 或正好出现 1 的几率非常小。你到底想做什么?
  • @Scony - 你建议的问题没有谈论结果的开放/封闭间隔......
  • @Alexei Levenkov - 对,但它显示了方法。如果您了解方法,则打开/关闭间隔是微不足道的

标签: c# random


【解决方案1】:

第一个很简单,这就是 NextDouble 方法返回的内容;

Random rnd = new Random();
double number = rnd.NextDouble();

要排除零,如果得到零,请选择一个新数字:

double number;
do {
  number = rnd.NextDouble();
} while(number == 0.0);

要包含 1 但不包含 0,请从 1 中减去随机数:

double number = 1.0 - rnd.NextDouble();

要同时包含 0 和 1,您可以使用类似于 King King 建议的方法,并使用足够大的数字来满足您的需要:

double number = (double)rnd.Next(Int32.MaxValue) / (Int32.MaxValue - 1);

(使用整数可以获得 31 位精度。如果您需要更多,则需要使用 NextBytes 获得 8 个字节,您可以将其转换为长整数。)

【讨论】:

    【解决方案2】:

    这取决于你想要的精度,我想精度是0.001,试试这个代码:

    var rand = new Random();
    //1
    var next = (float) rand.Next(1000)/1000;
    //2
    var next = (float) rand.Next(1,1000)/1000;
    //3
    var next = (float) rand.Next(1,1001)/1000;
    //4
    var next = (float) rand.Next(1001)/1000;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2017-01-23
      • 2016-08-27
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多