случайное число 65-90 [аз] или 97-122 [аз] - PullRequest
1 голос
/ 20 апреля 2011

Мне нужен метод в C, который возвращает случайное число между десятичным 65-90 [a - z] и десятичным 97-122 [A - Z].Если я вызываю метод, метод должен иметь другое число, возвращать то, что он ранее дал. Как я могу сделать это в C?

Ответы [ 4 ]

2 голосов
/ 20 апреля 2011

Можете ли вы сделать случайное число от 0 до 52 (исключая 52)?

Сделай это! Добавьте 65 к результату. если значение равно 91 или больше, добавьте 6 ко 2-му результату. Вуаля!

Ооо ... если число такое же, как и в прошлый раз (вы сохранили последнее число в статической переменной, не так ли?), Сделайте это снова:)

2 голосов
/ 20 апреля 2011
#include <stdlib.h>

char rand_az_AZ() {
    char val = rand() % 52;
    if (val < 26) {
        val += 'a';
    } else {
        val -= 26;
        val += 'A';
    }
    return val;
}
1 голос
/ 20 апреля 2011

Учитывая функцию random_in_range, которая возвращает случайные целые числа в диапазоне [0, n):

char random_letter()
{
    static const char letters[] = "abcdefghijlkmnopqrstuvwxyz"
                                  "ABCDEFGHIJLKMNOPQRSTUVWXYZ";
    return letters[random_in_range(sizeof(letters))];
}

(Простая реализация random_in_range(n) вернула бы rand() % n. Это не вернуло бы равномерно распределенные целые числа.)

0 голосов
/ 20 апреля 2011

ОБНОВЛЕНИЕ 2

Снова обновлено в соответствии с комментарием Interjay.

ОБНОВЛЕНИЕ

Внес изменения в комментарий Interjay. Также изменил pickChar, чтобы мы не полагались на конкретную кодировку.

Предупреждение: использование оператора % для сопоставления результатов rand с другим диапазоном не рекомендуется. Не гарантируется равномерное распределение битовых комбинаций младших разрядов, и вы можете получить ненормальное распределение значений. Это работает достаточно хорошо для заданий класса, но процедура ниже должна дать лучшие результаты:

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

int randInRange(int min, int max) 
{
  return (int)(((double) rand() / (double)(RAND_MAX + 1)) * (max - min + 1)) + min;
}

char pickChar(void)
{
  char val; 
  int cas = randInRange(0, 1);

  if (cas == 1)
    val = (char) randInRange('A', 'Z');
  else
    val = (char) randInRange('a', 'z');

  return val;
}

int main(void)
{
  char results[11] = {0};
  int i;

  srand(time(NULL));  // seed the random number generator

  for (i = 0; i < sizeof results - 1; i++)
    results[i] = pickChar();

  printf("Random string: %s\n", results);
  return 0;
}
...