Премини към съдържанието
Kristian Panov

C++ Шанс за падане на дадено число.

Препоръчан отговор


Здравейте!
Искам да попитам, как може да се направи така, че примерно да задам на еди кои си числа по-голям шанс да се паднат от други.
Всмисъл, имам една програма, която генерира 6 числа, които са от 1 до 47.
Та може ли така да стане, че на пример 14, 15, 44 да имат по-голям шанс да се паднат отколкото останалите.
Ето я програмата с генерирането:

 

#include <fstream>
#include <iostream>
#include <windows.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <ctime>

using namespace std;

void setcolor(unsigned short color)
{
    HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hcon,color);
}

static void getSix (int *dst)
{
    int sz, pos, i, src[47];
    for (i = 0; i < sizeof(src) / sizeof(*src); i++)
        src = i + 1;
    sz = 47;
    for (i = 0; i < 6; i++)
    {
        pos = rand() % sz;
        dst = src[pos];
        src[pos] = src[sz - 1];
        sz--;
    }
}

int main()
{

    system("chcp 1251 > nul");
    system("title LotteryWin");

    ofstream myfile("Data.dat", ios::app);
    string date;
    string line;

    int choice;
    cout << "1.Generate Ticket Numbers" << endl;
    cout << "2.List Previous Ticket Numbers" << endl;
    cout << "3.Exit" << endl << endl;
    cout << "Please, enter your choice: ";
    cin >> choice;

    if(choice == 1)
    {
        system("cls");

        cout << "Please, enter the date." << endl;
        cout << "Date: ";
        cin.clear();
        cin.ignore(0xffff, '\n');
        getline(cin, date);

        system("cls");

        srand (time (NULL));
        int i, numbers[6];
        getSix (numbers);

        setcolor(10);
        cout << "Numbers are:" << endl;
        setcolor(7);

        for (i = 0; i < sizeof(numbers) / sizeof(*numbers); i++)
        {
            cout << numbers << " ";
        }

        myfile << "[" << date << "]" << "\n";
        myfile << "Numbers: ";
        for (i = 0; i < 6; i++) myfile << numbers << " ";
        myfile << "\n";
        myfile << "------------------------------" << "\n";
        myfile.close();
    }
    if(choice == 2)
    {

        system("cls");
        setcolor(15);

        ifstream myfile ("Data.dat");
        if(myfile.is_open())
        {
            while(getline(myfile, line))
            {
                cout << line << '\n';
            }
            myfile.close();
        }
        else
        {

            setcolor(12);
            cout << "Unable to open file";

        }


    }
    if(choice == 3)
    {

        return 0;

    }

    system("pause > nul");
    return 0;
}
 

Редактирано от Kristian Panov (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това се прави, като се генерира по-голям диапазон числа от нужните ти и съответствие между число от диапазона и желано число. Например ако искаш тези числа, които си казал да се падат двойно по-вероятно, генерираш числа от 1 до 50 вместо от 1 до 47 и ако се падне 48 връщаш 14, за  49 -15 и така. По този начин, за 14 имаш две числа 14 и 48, съответно двойно по-голяма вероятност. В зависимосто от това какво искаш си смяташ нужния диапазон и мапването. За толкова малко числа и множител цяло число, най-лесно е с look-up таблица.

Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 10 минути, flare написа:

Това се прави, като се генерира по-голям диапазон числа от нужните ти и съответствие между число от диапазона и желано число. Например ако искаш тези числа, които си казал да се падат двойно по-вероятно, генерираш числа от 1 до 50 вместо от 1 до 47 и ако се падне 48 връщаш 14, за  49 -15 и така. По този начин, за 14 имаш две числа 14 и 48, съответно двойно по-голяма вероятност. В зависимосто от това какво искаш си смяташ нужния диапазон и мапването. За толкова малко числа и множител цяло число, най-лесно е с look-up таблица.

Ок, мерси!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
на 8/18/2016 в 18:34, flare написа:

Това се прави, като се генерира по-голям диапазон числа от нужните ти и съответствие между число от диапазона и желано число. Например ако искаш тези числа, които си казал да се падат двойно по-вероятно, генерираш числа от 1 до 50 вместо от 1 до 47 и ако се падне 48 връщаш 14, за  49 -15 и така. По този начин, за 14 имаш две числа 14 и 48, съответно двойно по-голяма вероятност. В зависимосто от това какво искаш си смяташ нужния диапазон и мапването. За толкова малко числа и множител цяло число, най-лесно е с look-up таблица.

Ох, не, чакай, нещо не ти схващам мисълта.

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 7 часа, Kristian Panov написа:

Ох, не, чакай, нещо не ти схващам мисълта.

Ами кажи какво си и какво не си разбрал  за да дообясня.

Ето елементарен пример за идеята. Искаш да имаш числата от 1 до 4, като 2 и 3 са с двоен шанс. Ми хвърляш зарче и ако се падне до 4 го взимаш както е, ако се падне 5 приемаш, че се е паднало 2, ако се падне 6 приемаш, че се е паднало 3.

Ако искаш да кажем числата от 1 до 10 като 7 е с 10% по-голям шанс от другите, правиш да се падат числата от 1 до 101. ако се падне от 1 до 10 връщаш 1, ако се падне от 11 до 20 - 2 и така. Трика е като се падне 101 - тогава връщаш 7. и така за всички числа ще имаш 10 отговарящи стойности, освен за 7 за което имаш 11 - т.е. с 10% повече. Като може диапазоните да са последователно или разбъркани - няма значение, ако началната ти (псевдо)случайна ти функция ги генерира равновероятни. Важното е съответствието паднало-се-число към прието-число да отговаря на изискванията ти.

Редактирано от flare (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 15 часа, flare написа:

Ами кажи какво си и какво не си разбрал  за да дообясня.

Ето елементарен пример за идеята. Искаш да имаш числата от 1 до 4, като 2 и 3 са с двоен шанс. Ми хвърляш зарче и ако се падне до 4 го взимаш както е, ако се падне 5 приемаш, че се е паднало 2, ако се падне 6 приемаш, че се е паднало 3.

Ако искаш да кажем числата от 1 до 10 като 7 е с 10% по-голям шанс от другите, правиш да се падат числата от 1 до 101. ако се падне от 1 до 10 връщаш 1, ако се падне от 11 до 20 - 2 и така. Трика е като се падне 101 - тогава връщаш 7. и така за всички числа ще имаш 10 отговарящи стойности, освен за 7 за което имаш 11 - т.е. с 10% повече. Като може диапазоните да са последователно или разбъркани - няма значение, ако началната ти (псевдо)случайна ти функция ги генерира равновероятни. Важното е съответствието паднало-се-число към прието-число да отговаря на изискванията ти.

Това че 7 се среща 10% по-често (10% * 10 + 10=11) не означава, че шансът да се падне е с 10% по-голям, в случая той е с малко под 1% повече.

Това е така, защото за всяко число освен 7 шансът е 10/101 или 9.9%, а за 7 е 11/101=10.8%.

Ако числата са 111, като за диапазона 91-111 връщаме 7,
тогава шансът да се падне 7 е 21/111=18.9%, а за другите числа е 10/111=9% .

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 20 минути, programprogram написа:

Това че 7 се среща 10% по-често (10% * 10 + 10=11) не означава, че шансът да се падне е с 10% по-голям, в случая той е с малко под 1% повече.

Това е така, защото за всяко число освен 7 шансът е 10/101 или 9.9%, а за 7 е 11/101=10.8%.

Отначало реших че си прав, ама не е така. Но дай да си сверим дефинициите за "шансът да се падне е с 10% по-голям." Може да е така ако си решил че имам предвид 10% по-голям от равновероятния, а аз имам предвид 10% по-голям от другите при същото теглене - както е условието:

на 8/18/2016 в 18:14, Kristian Panov написа:

че примерно да задам на еди кои си числа по-голям шанс да се паднат от други.

Според моята 10/101 * 1.1 = 11/101 тоест, число чийто шанс да се падне е 11/101 има точно с 10% шанс да се падне повече. Или да го кажа с други думи, ако направим достатъчно много опити с функцията която аз предложих, най-накрая ще имаме с 10% повече седмици, отколкото която и да е друга цифра.

Но уточнението ти е може да е важно за автора - да си изясни какво точно иска да получи.

 

Редактирано от flare (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

преди 23 часа, flare написа:

Отначало реших че си прав, ама не е така. Но дай да си сверим дефинициите за "шансът да се падне е с 10% по-голям." Може да е така ако си решил че имам предвид 10% по-голям от равновероятния, а аз имам предвид 10% по-голям от другите при същото теглене - както е условието:

Според моята 10/101 * 1.1 = 11/101 тоест, число чийто шанс да се падне е 11/101 има точно с 10% шанс да се падне повече. Или да го кажа с други думи, ако направим достатъчно много опити с функцията която аз предложих, най-накрая ще имаме с 10% повече седмици, отколкото която и да е друга цифра.

Но уточнението ти е може да е важно за автора - да си изясни какво точно иска да получи.

 

Ами, това, което искам да се получи е да се направи на пример една извиквателна функция (void), която ще е примерно void Chance(), и като се извика преди генерирането на числата:

Chance(число, шанс в проценти) /ПРИМЕР/

Chance(39, 40%);

Chance(9, 20%);

for (i = 0; i < sizeof(numbers) / sizeof(*numbers); i++)
        {
            cout << numbers << " ";
        }

 

Редактирано от Kristian Panov (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


  • Горещи теми в момента

  • Подобни теми

    • от HelloWorld
      Здравейте,
      Някой може ли да помогне с презаписването на масив в друг масив, т.е входните данни се записват в даден масив, но след това трябва да се прехвърлят на друг в отделна функция. 
    • от ValentinMitev1
      Здравейте!
      Трябва да направя програма на анимиран дигитален часовник в c++(graphics.h). Целта е числата да се променят анимирано-  да се показват отдолу и да се скриват горе (флип часовник).  Ще съм благодарен, ако някой може да ми помогне.
       
    • от Магдаленаг
      Здравейте!
      Please accept the challenge
      Зададена ми е следната задача:
      Дадени са две големи цели числа N1 и N2(до 100 цифри). Да се напишат програмни фрагменти за:
      а) представяне на числата чрез списъци;
      б) сравнение на двете числа и отпечатване на резултата - N1>N2 или N1<N2.
      Упътване: Големи числа се наричат цели положителни числа с К цифри, където К>255. Големите цели числа могат да се представят с помощта на линеен едносвързан списък, всеки елемент на който съдържа точно една цифра от числото.
      Език: С++
      Компилатор: Windows Visual Studio C++
      Благодаря предварително!
    • от windowsv
      Добър вечер! Задачата ми е следната: имам динамичен масив от обекти-градове с надморска височина, географска дължина и ширина. Сортирам ги по метода на мехурчето по географската дължина/от запад на изток/ и извеждам сортираните дължини във възходящ ред. Проблемът е,че в самото извеждане трябва да ми излизат сортирани градовете по имена, а не само техните дължини. Понеже член-данните са ми в секция private, няма как в main() да ги достъпя /пробвах с метод на класа, връщащ само географската дължина и така да направя сортирането, но не се получава/ и затова създадох втори масив само за дължините. Преподавателката ми каза, че трябва да имам конструктор за копиране и да предефинирам операция равно. Последните две неща мога да ги направя, но не мога да схвана идеята как това се включва в моята програма.Ето кодът ми:
      #include "stdafx.h"
      #include<iostream>
      #include<math.h>
      using namespace std;

      class City{
      private: char *name;
      double width;
      double length;
      double height;
      public:
      void Input();
      void Output();
      City();
      ~City();
      double GetLength();
      };
      City::City()
      {
      char ime[20];
      cout << "Name= ";
      cin >> ime;
      name = new char[strlen(ime) + 1];
      for (int i = 0; i <=strlen(ime); i++)
      name = ime;

      cout << "Width= ";
      cin >> width;
      cout << "Length= ";
      cin >> length;
      cout << "Height= ";
      cin >> height;
      }
      void City::Input()
      {
      char ime[25];
      cout << "Input name of city:" << endl;
      cin >> ime;
      name = new char[strlen(ime) + 1];
      for (int i = 0; i < strlen(ime); i++)
      {
      name = ime;
      cout << name;
      }
      cout << "Input height of city " << endl;
      cin >> height;
      cout << "Input length of city " << endl;
      cin >> length;
      cout << "Input width of city " << endl;
      cin >> width;



      return;
      }
      void City::Output()
      {
      cout << "Name is: " << name << endl;
      cout << " Width is: " << width <<" deg"<< endl;;
      cout << " Length is: " << length << " deg"<<endl;
      cout << " Height is: " << height <<" m"<<endl;
      return;
      }
      City::~City()
      {
      cout << " " << endl;
      cout << "Destructor of City!" << endl;
      delete[] name;
      }
      double City::GetLength()
      {
      return length;
      }
      int main()
      {
      //City town;

      //town.Input();
      //town.Output();
      int n;
      City *mA;
      cout << "Input number of cities: " << endl;
      cin >> n;
      mA = new City[n];
      for (int j = 0; j < n; j++)
      {
      mA[j].Output();
      }
      cout << "Cities from west to east, sorted by their length" << endl;
      double *Lengths = new double[n];
      for (int j = 0; j < n; j++)
      {
      Lengths[j] = mA[j].GetLength();

      }


      int k = 0;//counter
      double max = Lengths[0];
      for (int j = 1; j < n; j++)
      {
      if (Lengths[j - 1] >Lengths[j])
      {
      max = Lengths[j - 1];
      Lengths[j - 1] = Lengths[j];
      Lengths[j] = max;
      }
      }


      for (int j = 0; j < n; j++)//cycle for output
      {
      cout << Lengths[j] << "\n";
      }


      delete[]mA;
      return 0;

      }
      Моля за някакви насоки ако е възможно стигнал съм до задънена улица. Пробвах с указатели, все не се получава.
       
    • от Nero AN
      Здравейте, някои може ли да ми помогне с тази задача?
      Благодаря предварително!
      Задачата е следната:

  • Разглеждащи в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.