Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

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

Featured Replies

Здравейте!
Искам да попитам, как може да се направи така, че примерно да задам на еди кои си числа по-голям шанс да се паднат от други.
Всмисъл, имам една програма, която генерира 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 (преглед на промените)

  • Автор
преди 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% .

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

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.