簡體   English   中英

在C#中生成隨機浮點數

[英]generate random float number in C#

如何生成介於-11之間且主分布在-0.10.1之間的100個隨機float (浮點數的90%必須在-0.10.1之間)。 目前我使用的不是我想要的

for (int counter = 0; counter < 100; counter++)
{
   randomnum = 0f;
   randomnum = Convert.ToSingle(randomvalues.NextDouble() / 10);
   storerandomvalues1[counter] = randomnum;
}

任何想法?

這應該工作。 它會生成一個隨機數來選擇您是否在-0.1,0.1范圍內,然后生成第二個擴展到所需的實際范圍內的數字。您可以只用一個隨機double ,但是這樣做會更容易錯誤的代碼,並且難以閱讀(所有這些都是對性能的微小改進)。

for (var counter = 0; counter < 100; counter++)
{
    int selector = randomvalues.Next(10); // 0 <= selector < 10
    double randomnum;
    if (selector < 9)
    {
        randomnum = randomvalues.NextDouble() * 0.2 - 0.1;
    }
    else
    {
        randomnum = randomvalues.NextDouble() * 1.8 - 0.9;
        randomnum += Math.Sign(randomnum) * 0.1;
    }
    storerandomvalues1[counter] = (float)randomnum;
}

正如我在評論中說的那樣,有無數種可能的解決方案。 有兩種可能的解決方案:

  1. 平均值為0且標准偏差為0.06079的正態(aka高斯)分布將在-0.1到+0.1之間產生90%的結果,因此生成標准正態並將其乘以0.06079。 從技術上講,您應該檢查絕對值是否超過1,但這對應於獲得16 sigma的結果-這將不會發生。

  2. 但是,您可能不喜歡這樣的解決方案,因為它實際上不會覆蓋整個范圍。 如前段所述,將生成X變體,如果X < -0.1 ,則將其替換為Uniform(-1,-0.1)。 同樣,如果X > 0.1 ,則將其替換為Uniform(0.1,1)。

我實現了這兩個,生成了100,000個值,這是直方圖:

兩種方法的直方圖和分位數

請注意,第5 95 分位數分別為-0.0998和+0.09971,有效地為-0.1和+0.1,在采樣誤差內。

使用日志功能,生成1到10之間的浮點數,然后以結果的對數為10。 然后隨機更改符號。

試試這個,它應該可以工作...

   Random rnd = new Random();
    for (int counter = 0; counter < 100; counter++)
    {
        storerandomvalues1[counter]=(2*rnd.NextDouble())-1; // Exact Sample() is protected so u can use NextDouble()
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM