首頁>Program>source

我找不到从 [0,a]中找到隨機浮點數的解決方案 ,其中 a 是使用者定義的一些浮點數。

我尝試了以下方法,但似乎無法正常工作。

float x=(float)rand()/((float)RAND_MAX/a)
最新回復
  • 6月前
    1 #

    尝試:

    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的绝對優势 (它將關闭).有關原因的详细資訊,請參见本文。

    Sample

    #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;
    }
    

    Output

    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
    

  • 6月前
    2 #

    您還可以在範圍[min,max]中生成類似

    的內容
    float float_rand( float min, float max )
    {
        float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */
        return min + scale * ( max - min );      /* [min, max] */
    }
    

  • 6月前
    3 #

    如果要在某个範圍內生成隨機浮點,請尝試下一个解決方案。

    #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;
    }
    

    A result (values is fickle)

    -------------------------------------------
         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
    -------------------------------------------
    

  • javascript:AJAX jQuery每5秒重新整理一次div
  • javascript:命中測試的SVG形狀?