Премини към съдържанието
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 (преглед на промените)

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


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

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

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

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

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

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

    Вход

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

    Вход


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

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

      • от Nero AN
        Зададен е едномерен масив от цели числа A0, A1....... An-1. Да се състави програма която създава нов масив а0, а1......., а-1, като стойността на аi е равна на разликата между сумата на четните цифри и сумата на четните цифри на Аi. В програмата да се използват деинамични масиви.


        Благодаря предварително!
      • от Petko2002
        Това е задачата, решението и моят код по задачата ако може да ми кажете къде бъркам
         
         
        #include "stdafx.h"
        #include <iostream>
        #include <string.h>
        #include <math.h> using namespace std; int main()
        {
         cout << "x= ";
         double x;
         cin >> x;
         if (!cin)
         {
          cout << "Error, Bad input! \n";
          return 1;
         }
         cout << "eps= ";
         double eps;
         cin >> eps;
         if (!cin)
         {
          cout << "Error, Bad input! \n";
          return 1;
         }
         if (eps <= 0)
         {
          cout << "Incorrect input! \n";
          return 1;
         }
         double x1 = 1;
         double s = 1;
         int i = 1;
         while (fabs(x1) >= eps)
         {
          x1 = pow(x, i) / i;
          s = s + x1;
          i++;
         }
         cout << "s=" << s << "\n";
         return 0;
        }
      • от 7564321
        Здравейте, тази задача ми се бе паднала на контролно, за съжаление се мъча твърде дълно с нея затова се налага да потърся съвет от някой с повече опит.
        Та ето го условието: 
        Да се създаде свързан списък от естествени числа до въвеждането на 0, чрез добавяне в края. Готовият списък да се иведе на екрана. Да се въведе от клавиатура та цяло число Х и всички елементи на списъка , по-големи от  Х , да се запишат в стек. Да се прочетат елементите на стека и да се изведат на екрана.
        Кодът написан до момента. (фунциите ползвани в него са ни преподавани в лекциите). Моля да обясните защо не работи, как е правилно да бъде направено. 
        #include <iostream> using namespace std; struct List { int x; List *next; }; void Spush(List *& top, int i) { List *p = new List; p->x = i; p->next = top; top = p; } List * Spop(List *& top) { if (top == NULL) return top; List *p = top; top = top->next; return p; } void AddEnd(List *& first, List *& last, int i) { List *p = new List; p->x = i; p->next = NULL; if (first == NULL) first = last = p; else { last->next=p; last=p; } } void PrintList(List * first) { List *p = first; while (p != NULL) { std::cout << p->x << " "; p = p->next; } std::cout << std::endl; } int main() { int y; cin>>y; List *first=NULL,*st,*last; st=NULL; List *p=first; while(y!=0){ AddEnd(first,last,y); cin>>y; } PrintList(first); // Тази част работи до тук st=NULL; int X; cin>>X; if(X>=0){ while (p!=NULL){ if (p->x>X) { Spush (st,p->x); p=p->next; } } } else cout<< "X is less that 0"; while ((p=Spop(st))!=NULL){ cout <<p->x<<" "; delete p; } //Елементите не се извеждат, без никакви грешки cout<<endl; }  
      • от emilovanon
        Здравейте, колеги! Някой може ли да реши задачата: 
        Да се състави програма, която реализира структурата списък. Елементите на структурата да са цели числа тип SHORT. Програмата да представя основните операции със структурата включване и изключване на елемент.
    • Разглеждащи в момента   0 потребители

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

    • Дарение

    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.