[英]generate random float number in C#
如何生成介於-1
和1
之間且主分布在-0.1
至0.1
之間的100個隨機float
(浮點數的90%必須在-0.1
到0.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;
}
正如我在評論中說的那樣,有無數種可能的解決方案。 有兩種可能的解決方案:
平均值為0且標准偏差為0.06079的正態(aka高斯)分布將在-0.1到+0.1之間產生90%的結果,因此生成標准正態並將其乘以0.06079。 從技術上講,您應該檢查絕對值是否超過1,但這對應於獲得16 sigma的結果-這將不會發生。
但是,您可能不喜歡這樣的解決方案,因為它實際上不會覆蓋整個范圍。 如前段所述,將生成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.