Как я могу использовать два случайных числа, сгенерированных в функции, в качестве координат матрицы? - PullRequest
1 голос
/ 02 июня 2019

Я придумал эту функцию для генерации двух случайных чисел, r и c, чтобы я мог использовать их в качестве координат на матричной доске [r] [c]. Это вообще возможно?

int coordAleatoria()
{
    srand((unsigned int)time(0));
    int r=rand()%9;
    int c=rand()%9;
    while(r==c)
    {
        c=rand()%9;
    }
    printf("%d %d", r, c);
    return r;
    return c;
}

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

Я надеюсь, что я могу получить r и c в board [r] [c], чтобы они были значениями, сгенерированными вordinAleatoria ().

Ответы [ 3 ]

2 голосов
/ 02 июня 2019

Вы не можете вернуться более одного раза. Таким образом, вы можете объединить координаты, используя структуру, как предложил Jabberwocky в комментарии. Если вам все еще сложно, то вот реализация.

#include<stdio.h>
#include<stdlib.h>//for rand()
#include<time.h>//for time()
struct Pair
{
    int row,col;
};
struct Pair coordAleatoria()
{
    int r=rand()%9;
    int c=rand()%9;
    while(r==c)
    {
        c=rand()%9;
    }
    printf("Inside function: row=%d and col=%d\n",r,c);
    //Create a pair
    struct Pair p;
    //Assign values
    p.row=r,p.col=c;
    //return it
    return p;
}
int main()
{
    srand((unsigned int)time(0));
    //Get the returned value as a Pair
    struct Pair p=coordAleatoria();
    //Collect the row and column values
    int r=p.row;
    int c=p.col;
    //Now you can use them here
    printf("Outside function: row=%d and col=%d\n",r,c);
}
1 голос
/ 02 июня 2019
  • rand()%9 генерирует 9 различных значений.С while(r==c) похоже, что код ищет 9 * (9-1) или 72 различных пары.Для более быстрого подхода вызовите rand() один раз.

  • Код может вернуть один int, а затем божественный / мод на 9, чтобы восстановить строку / столбец.

  • srand((unsigned int)time(0)); не должно повторяться, вызывается в coordAleatoria().Назовите это однажды, возможно, в main().


int coordAleatoria(void) {
  int rc = rand()%72;
  int r = rc/9;
  int c = rc%9;
  if (r==c) r++;
  return (r*9) + c;
}
0 голосов
/ 02 июня 2019

Вместо того, чтобы вызывать rand() дважды (после правильного заполнения генератора случайных чисел вызовом srand()), вы можете просто позвонить rand() один раз и взять первые две цифры в качестве своих координат, например,

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

typedef struct {
    int x, y;
} pair_t;

void rand_coords (pair_t *coords)
{
    int n = rand();

    coords->x = n % 10;
    n /= 10;
    coords->y = n % 10;
}

int main (void) {

    pair_t coords = { .x = 0 };

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

    rand_coords (&coords);

    printf ("coords.x : %d\ncoords.y : %d\n", coords.x, coords.y);

    return 0;
}

( или по модулю любого фактического диапазона координат)

Пример использования / Вывод

$ ./bin/coords_rand
coords.x : 9
coords.y : 8

$ ./bin/coords_rand
coords.x : 1
coords.y : 1

$ ./bin/coords_rand
coords.x : 5
coords.y : 7

$ ./bin/coords_rand
coords.x : 8
coords.y : 0
...