Я получаю одно и то же значение каждый раз в rand () в C - PullRequest
0 голосов
/ 02 мая 2020

В этой программе мне нужно взять 2 случайных числа, и одно из них должно быть равно 3. Чтобы сделать их, функция randomSet работает некоторое время l oop, но проблема в основной функции : l oop дает мне одинаковые 2 числа каждый раз. Как получить разные числа на каждой итерации?

int randomSet(int temp[])
{
  while (temp[0] != 3 && temp[1] != 3)
         {
            temp[0] =rand()%4;
            temp[1] =rand()%4;
         }
}

Основная функция

int main()
{
    srand(time(0));
    int temp[2];
    int x =0,y =0;
    for (int i = 0; i < 5; i++) {
        randomSet(temp);
    }
    return 0;
}

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Вы можете легко набрать код и посмотреть, что происходит. Как уже указывалось, ключевое необходимое изменение заключается в том, что вы должны определить два случайных значения при входе в функцию, прежде чем проверять, равно ли одно из них (или оба) 3. Это легко достигается с помощью do { … } while (…); l oop.

Несмотря на предположения об обратном, условие l oop в вопросе в порядке, хотя его необходимо преобразовать из while l oop. L oop продолжается, пока ни один из элементов не равен 3; как только один или другой равен 3 (или оба равны 3, но он проверяет только первый элемент, temp[0]), l oop останавливается.

Например (файл rand19.c):

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

static void randomSet(int temp[])
{
    do
    {
        temp[0] = rand() % 4;
        temp[1] = rand() % 4;
        printf("--  %d  %d\n", temp[0], temp[1]);
    } while (temp[0] != 3 && temp[1] != 3);
}

int main(void)
{
    srand(time(0));
    int temp[2];
    for (int i = 0; i < 5; i++)
    {
        randomSet(temp);
        printf("%d:  %d  %d\n", i, temp[0], temp[1]);
    }
    return 0;
}

Пример выполнения:

$ rand19
--  2  0
--  1  3
0:  1  3
--  0  3
1:  0  3
--  0  3
2:  0  3
--  2  2
--  0  1
--  3  0
3:  3  0
--  2  0
--  2  0
--  1  0
--  1  0
--  2  3
4:  2  3
$ sleep 60
$ rand19
--  3  3
0:  3  3
--  1  3
1:  1  3
--  1  0
--  3  1
2:  3  1
--  3  2
3:  3  2
--  0  2
--  1  1
--  1  2
--  0  1
--  1  2
--  2  1
--  3  1
4:  3  1
$
1 голос
/ 02 мая 2020

Вы не инициализируете temp перед передачей его в randomSet(), поэтому его содержимое равно неопределенно , в результате чего while (temp[0] != 3 && temp[1] != 3) имеет неопределенное поведение .

Я предлагаю вам изменить randomSet(), чтобы вместо него использовать do..while l oop, чтобы заполнить temp 1 раз, прежде чем затем приступить к анализу его содержимого, например:

int randomSet(int temp[])
{
    do
    {
        temp[0] = rand() % 4;
        temp[1] = rand() % 4;
    }
    while (temp[0] != 3 && temp[1] != 3);
}
0 голосов
/ 02 мая 2020
int randomSet(int temp[])
{
  while (1)
         {
            x = rand()%4;
            y = rand()%4;
            if (x < 3 && y < 3) 
            {
               temp[0] = x;
               temp[1] = y;
            }
            else
               break;
         }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...