Неповторяющиеся наборы из 6 случайных чисел с использованием только циклов - PullRequest
0 голосов
/ 29 марта 2020

Можете ли вы помочь мне с этим. У меня проблемы с концептуализацией этого. Также ему требуются глобальные объявления

. Для этого проекта вам поручено создать пользовательское приложение, которое будет выбирать наборы случайных чисел. Ваше приложение должно использовать функции и передавать значения. Ваша программа выберет наборы из 6 случайных чисел со значениями от 1 до 53. Пользователь должен иметь возможность выбирать, сколько наборов производить. Задача будет состоять в том, чтобы убедиться, что ни один номер из набора 6 не является повторением. Ваша программа должна подсказать пользователю и спросить, сколько наборов чисел он будет иметь sh. Это может быть использовано в качестве приложения быстрого выбора лотерейного билета. Для тех, кто не потворствует азартным играм, это может быть просто инструмент для выбора случайных чисел для забавной игры.

Это перед уроком массива. Я только должен использовать циклы и srand((time(NULL)). Нет массивов или функций случайного воспроизведения.

Итак, я подумал:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FIRST 1
#define LAST 53
#define COUNT 6

int PrintIns(void)
{
  printf("******************************************************************\n");
  printf("Enter the amount of sets of 6 random numbers you want to generate.\n");
  printf("Enter in 'q' or 'Q' to quit...\n");
  printf("******************************************************************\n");
}


int PrintRand(int FIRST, int LAST, int COUNT) 
{ 
    int i; 
    for (i = 0; i < COUNT; i++) { 
        int num = (rand() % 
        (FIRST - LAST + 1)) + LAST; 
        printf("%d ", num); 
    return num;
    } 
} 


int main(void){
  int numSets = -99;
  srand(time(NULL));
  int runningSetCount = -99;
  int i;
  int num;
  int exit;
  {
    do{
      PrintIns();
      scanf("%d" , &numSets);
      if(numSets == 81)
        {
          break;
        }
      else if(numSets == 113)
        {
          break;
        }
        else{
          runningSetCount = 1;
          for(i=runningSetCount; i<=numSets; i++)
          {
            printf("**Set Number %3d of six numbers:   %3d\n" , runningSetCount, PrintRand(num));
          }

        if(numSets == 81)
        {
          printf("You have chosen to quit the program");
          return 0;
        }
        else if(numSets == 113)
        {
          printf("You have chosen to quit the program");
          return 0;        
        }
        else{
          printf("You have finished generating your sets of random numbers.\n");
          printf("Do you wish to continue or exit? Enter Q or q to quit or 1 to continue...\n");
          scanf("%d" , &exit);
          if(exit == 81){
            break;
          }
          else if(exit == 113){
            break;
          }
          else if(exit == 1){
            //how do i get the program to restart???
          }
          else //how do i restart this new loop to ask again for input??

        }

        }




Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Во-первых, нигде в проблеме не сказано, что N наборов, которые вам нужно сгенерировать, должны быть разными, поэтому, пока вы можете генерировать 1 набор, вы можете генерировать N наборов. Во-вторых, хотя вы не можете использовать массивы, 6 - это очень небольшое число, поэтому вы можете сделать это с 6 переменными и некоторым копированием-вставкой кода (это не красиво).

Для самого алгоритма я бы сохранил он базируется c и делает «пока я не сгенерировал 6 уникальных чисел, продолжайте генерировать». Теоретически он никогда не останавливается (поскольку вы можете продолжать генерировать случайные числа, которые у вас уже есть), но для домашней работы этого достаточно.

Надеюсь, это поможет: D

0 голосов
/ 29 марта 2020

Я бы использовал uint64_t как массив из 8 байтов. С некоторыми побитовыми операциями это разрешимо.

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

// using uint64_t as an array of bytes like
//   |---|---|6th|5th|4th|3rd|2nd|1st|
void PrintRand(int COUNT) {
  uint64_t nums = 0;
  unsigned num = 0;
  int i, j;
  int duplicate = 0;

  for (int cnt = 0; cnt < COUNT; cnt++) {
    for (i = 0; i < 6; i++) {
      do {
        num = (rand() % 53) + 1;

        // check if there is a duplicate
        for (duplicate = 0, j = 0; j < 6; j++)
          // retrieving the nth number from nums
          if (((nums >> (j * 8)) & 0xff) == num)
            duplicate = 1;

        if (duplicate) // if there is, then start again
          continue;

        // else save it to nums
        nums |= (uint64_t)(num << (i * 8));
        // and break out from do while loop
        break;
      } while (1);

      printf("%d ", num);
    }
    printf("\n");
  }
}

int main() {
  srand(time(0)); 
  PrintRand(3);
  return 0;
}

Вывод

46 42 33 24 41 4 
15 6 25 9 11 52 
1 16 46 23 38 51 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...