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