Как генерировать случайные числа в форме _ _ _ . _ _ _ _ (язык C)

#c #random #numbers

#c #Случайный #числа

Вопрос:

Я пытался разобраться в этом последние пару дней, и у меня просто не получается. Я пытаюсь сгенерировать случайные числа в форме _ _ _ . _ _ _ _

итак, 3 цифры перед десятичным знаком, а затем 4 знака после запятой.

Любая помощь приветствуется. Спасибо,

Дин

Комментарии:

1. Просто спрашиваете о форматировании вывода?

2. Сгенерируйте случайное число от 0 до 9999999 и разделите на 10000

3. А затем использовать printf("%8.4fn", r); для форматирования результата.

4. @squeamishossifrage: Может быть, лучше разделить на 10000.0.

5. Тогда следуйте совету @FredLarson, но используйте printf(".4fn", r); вместо

Ответ №1:

Есть две небольшие проблемы с опубликованным вами кодом.

Во-первых, rand() % 9999999 может возвращать только значения от 0 до 9999998. Вы, вероятно, имели в виду написать rand() % 10000000 .

Другая проблема заключается в том, что rand() % 10000000 это даст вам слегка искаженные результаты. Я попытаюсь объяснить, почему.

rand() Функция возвращает значение от 0 до RAND_MAX , которое в большинстве случаев имеет значение 0x7fffffff , или 2147483647. (Если вы используете Visual Studio, то это всего лишь 0x7fff , но будем надеяться, что это не так.)

Поскольку RAND_MAX число, кратное 10^7, не является точным, вероятность выбора случайных значений, превышающих RAND_MAX % 10000000 (т.е. 7483647), будет немного меньше. Это означает, что ваши результаты будут слегка искажены в сторону диапазона 0-7483647.

Чтобы исправить это, вычислите rand() модуль в следующей степени 2, превышающий верхнюю часть вашего целевого диапазона, и отбросьте результат, если он слишком высок. Вычислительные издержки незначительны.

Вот некоторый код, который устраняет проблемы:

 #include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() {
    int number;
    double p;
    srand(time(NULL));
    while (1) {
        number = rand() % 16777216;  /* Next power of 2 higher than 10^7 */
        if (number < 10000000) break;
    }
    p = number / 10000.0;
    printf(".4fn", p);
    return 0;
}
  

Комментарии:

1. RAND_MAX может быть, к сожалению , только 32767 . Предложить ((1LU*rand()) << 15) ^ rand() компенсировать

2. Спасибо за вашу помощь!

3. Знаете ли вы способ, которым я мог бы взять эти случайные числа и поместить их в массив размером 5 на 5. При этом каждый элемент представляет собой другое случайное число, а не одно и то же?

4. @Dwhaley Да, но это не поместится в этот комментарий, и мне все равно нужно идти сейчас. Просто попробуйте сами. Это не так сложно.

Ответ №2:

Я думаю, у меня получилось

 #include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>



int main()
{
   srand(time(NULL));
   int number;
   double p;
   number = rand() % 9999999;
   p = (double)number / 100;


   printf("%8.4fn", p);

   getchar();
   return(0);


}
  

Комментарии:

1. rand() % 9999999 генерирует в лучшем случае 999 999 разных чисел. "_ _ _ . _ _ _ _" похоже на 1 000 000 различных шаблонов.

2. Почему / 100 ? Я бы ожидал / 10000.0 .