可能重複:
C++ random float
How to generate a random number in C?如何生成用C隨機浮點數
我無法找到解決方案,找到從[0,a]
,其中a
隨機浮點數是用戶定義的一些浮點數。
我試過以下,但它似乎並沒有正常工作。
float x=(float)rand()/((float)RAND_MAX/a)
可能重複:
C++ random float
How to generate a random number in C?如何生成用C隨機浮點數
我無法找到解決方案,找到從[0,a]
,其中a
隨機浮點數是用戶定義的一些浮點數。
我試過以下,但它似乎並沒有正常工作。
float x=(float)rand()/((float)RAND_MAX/a)
嘗試:
float x = (float)rand()/(float)(RAND_MAX/a);
要理解這一點是如何工作的考慮下。
N = a random value in [0..RAND_MAX] inclusively.
上述方程(除去爲了清楚石膏)變爲:
N/(RAND_MAX/a)
但是由一小部分分裂是相當於由乘以所述分數的倒數,所以這是等效於:
N * (a/RAND_MAX)
其可以被重寫爲:
a * (N/RAND_MAX)
考慮到N/RAND_MAX
始終是0.0到1.0之間的浮點值,這會生成一個介於0.0和a
之間的值。
或者,您可以使用以下內容,它有效地分解了上面顯示的故障。其實我只是喜歡這一點,因爲它是更清晰什麼是真正回事(對我來說,反正):
float x = ((float)rand()/(float)(RAND_MAX)) * a;
注:a
浮點表示必須確切或這絕不會打你絕對優勢的情況下a
(它將會關閉)。有關爲什麼,請參閱this article以瞭解詳細信息。
樣品
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
srand((unsigned int)time(NULL));
float a = 5.0;
for (int i=0;i<20;i++)
printf("%f\n", ((float)rand()/(float)(RAND_MAX)) * a);
return 0;
}
輸出
1.625741
3.832026
4.853078
0.687247
0.568085
2.810053
3.561830
3.674827
2.814782
3.047727
3.154944
0.141873
4.464814
0.124696
0.766487
2.349450
2.201889
2.148071
2.624953
2.578719
這可能真的很糟糕舍入屬性。 rand()返回一個32位的int值,您將轉換爲32位的float值,這會導致值被量化。例如,從1000000161到1000000223到1000000192,您獲得值1000000192的可能性比值爲1的可能性高64倍。您可以通過將其轉換爲double來避免這種情況,然後將其轉換爲最終的float值:float((double)rand()/(double)(RAND_MAX/a))。 –
如果要生成一個範圍內的隨機浮動,嘗試下一個解決方案。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
float
random_float(const float min, const float max)
{
if (max == min) return min;
else if (min < max) return (max - min) * ((float)rand()/RAND_MAX) + min;
// return 0 if min > max
return 0;
}
int
main (const int argc, const char *argv[])
{
srand(time(NULL));
char line[] = "-------------------------------------------";
float data[10][2] = {
{-10, 10},
{-5., 5},
{-1, 1},
{-0.25, -0.15},
{1.5, 1.52},
{-1700, 8000},
{-0.1, 0.1},
{-1, 0},
{-1, -2},
{1.2, 1.1}
};
puts(line);
puts(" From | Result | To");
puts(line);
int i;
for (i = 0; i < 10; ++i) {
printf("%12f | %12f | %12f\n", data[i][0], random_float(data[i][0], data[i][1]), data[i][1]);
}
puts(line);
return 0;
}
甲結果(值是善變)
-------------------------------------------
From | Result | To
-------------------------------------------
-10.000000 | 2.330828 | 10.000000
-5.000000 | -4.945523 | 5.000000
-1.000000 | 0.004242 | 1.000000
-0.250000 | -0.203197 | -0.150000
1.500000 | 1.513431 | 1.520000
-1700.000000 | 3292.941895 | 8000.000000
-0.100000 | -0.021541 | 0.100000
-1.000000 | -0.148299 | 0.000000
-1.000000 | 0.000000 | -2.000000
1.200000 | 0.000000 | 1.100000
-------------------------------------------
也可以生成在範圍[最小值,最大值]的東西,如
float float_rand(float min, float max)
{
float scale = rand()/(float) RAND_MAX; /* [0, 1.0] */
return min + scale * (max - min); /* [min, max] */
}
HTTP:// C- faq.com/lib/randrange.html – Ouadie
當然,https://www.google.com/search?q=How+to+generate+random+float+number+in+C – rid
謝謝。應該是: float x =(float)rand()/((float)RAND_MAX/a)或 float x =(float)rand()/((float)RAND_MAX/a + 1)? – fragon