Получение случайных чисел, которые остаются неизменными от функции к функции - PullRequest
2 голосов
/ 22 декабря 2011

Относительно новичок в C ++, и это беспокоило меня некоторое время.Я пытаюсь написать программу, которая будет делать разные вещи в зависимости от того, какое случайное число сгенерировано.

Чтобы объяснить, что я пытаюсь сделать просто, давайте представим, что я создаю список спортсменов и начинаемпутем случайного генерирования их высот в определенном диапазоне.Легко сделать без проблем.Скажем тогда, я хочу создать свой вес, исходя из их роста.Здесь все становится грязно.По какой-то причине я не могу понять, программа генерирует случайным образом вес, основанный на росте, отличном от того, который он возвращает в первую очередь.Я просто не понимаю.

В любом случае, вот фрагмент (очень упрощенного) примера кода, который, надеюсь, показывает, что я пытаюсь сделать.Я уверен, что упускаю что-то очевидное, но я просто не могу понять это.

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;

int random(int min, int max, int base)
{
    int random = (rand() % (max - min) + base);

    return random;
}

int height()
{
    int height = random(1, 24, 60);

    return height;
}

int weight()
{
    int weight = height() * 2.77;

    return weight;
}

void main()
{
    srand ((unsigned int)time(0));

    int n = 1;

    while (n <= 10)
        { 
        cout << height() << " and " << weight() << endl;
        ++n;
        }

    return;
}

Ответы [ 2 ]

5 голосов
/ 22 декабря 2011

weight снова вызывает height , и он, очевидно, будет генерировать другое число (в этом весь смысл ГСЧ :)).

Чтобы получить эффектВы хотите, чтобы вы могли:

  • изменить weight, чтобы принять height в качестве параметра;затем в main на каждой итерации сохраняйте значение, возвращаемое height во временную переменную, и передайте его высоте, чтобы получить соответствующую высоту;

    int weight(int height)
    {
        return height*2.77;
    }
    
    // ... inside the main ...
    while (n <= 10)
    { 
        int curHeight=height();
        cout << curHeight << " and " << weight(curHeight) << endl;
        ++n;
    }
    
  • moveheight и weight для класса, который будет хранить height в качестве частного поля, добавляя элемент nextPerson, который обновит внутреннее поле до нового случайного значения.

    class RandomPersonGenerator
    {
        int curHeight;
    public:
        RandomPersonGenerator()
        {
            nextPerson();
        }
    
        int height() { return curHeight; }
        int weight() { return height()*2.77; }
    
        void nextPerson()
        {
            curHeight=random(1, 24, 60);
        }
    };
    
    // ... inside the main ...
    RandomPersonGenerator rpg;
    while (n <= 10)
    { 
        rpg.nextPerson();
        cout << rpg.height() << " and " << rpg.weight() << endl;
        ++n;
    }
    

(кстати, это int main, а не void main, и цикл for более уместен, чем while в этой ситуации)

3 голосов
/ 22 декабря 2011

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

Ваша новая функция height()будет выглядеть следующим образом:

int weight(int height)
{
    int weight = height * 2.77;

    return weight;
}

В вашем main():

while (n <= 10)
{
    int h = height();
    int w = weight(h);

    cout << h << " and " << w << endl;
    ++n;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...