Премини към съдържанието
15 години Kaldata.com – време е да почерпим! Прочети още... ×
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 (преглед на промените)

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


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

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

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

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

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

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

Вход

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

Вход

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

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

    • от eXXcal
      #include <iostream> #include <fstream> #include <map> #include <ctime> #include <string> #include <stdio.h> #include <stdlib.h> #include <vector> #include <list> #include <iterator> #include <algorithm> #include <utility> #include <time.h> using namespace std; class CPerson { private: string name; string EGN; public: CPerson() { name=" "; EGN=" "; } CPerson(const string n, const string e) { name=n; EGN=e; } string getname()const { return name; } string getEGN()const { return EGN; } void setname(const string n) { name=n; } void setEGN(const string e) { EGN=e; } virtual void print() = 0; //1.1 int getAge() const //1.2 { int age; time_t currentTime; struct tm * ltm; time( &currentTime ); ltm= localtime( &currentTime ); int year = atoi(getEGN().substr(0, 2).c_str()); int month = atoi(getEGN().substr(2, 2).c_str()); int day = atoi(getEGN().substr(4, 2).c_str()); int cyear = 1900 + ltm->tm_year; int cmonth = 1 + ltm->tm_mon; int cday = 1 + ltm->tm_mday; age = cyear - (year + 1900); if (cmonth < month) age--; if (cmonth == month && cday < day) age--; return age; } }; class CStudent: public CPerson { private: string FN; map<int, int> st_tests; public: CStudent() { FN=" "; } CStudent(const string n) { FN=n; } CStudent(const string o, const string p, const string n):CPerson(o,p) { FN=n; } void setFN(const string n) { FN=n; } void setst_tests(map<int, int> m) { st_tests=m; } string getFN() const { return FN; } bool operator () (CStudent a, CStudent b) const { return a.average() < b.average(); } map<int, int> getst_tests() { return st_tests; } void print() { cout<<"Ime: "<<getname()<<endl; cout<<"EGN: "<<getEGN()<<endl; cout<<"FN: "<<getFN()<<endl; map<int, int>::iterator it=st_tests.begin(); while(it!=st_tests.end()) { cout<<it->first<<" "<<it->second<<endl; it++; } } void add_st_tests(int a, int b) { map<int, int>::iterator it=st_tests.begin(); while(it!=st_tests.end()) { st_tests.insert(pair<int,int>(a,b)); } } double average() //2.1 { double sum=0; map<int, int>::iterator it=st_tests.begin(); for (it=st_tests.begin();it!=st_tests.end();it++) sum+=it->second; if(st_tests.size()!=0) return sum/st_tests.size(); return -1; } int search(const int a) //2.2 { return st_tests.find(a)->second; } }; class CGroup { private: string spec; int kurs; int grupa; vector<CStudent> students; public: string getspec() const { return spec; } int getkurs() const { return kurs; } int getgrupa() const { return grupa; } vector<CStudent> getstudents() { return students; } void setstudents(vector<CStudent> a) { students=a; } void setspec(const string n) { spec=n; } void setkurs(const int n) { kurs=n; } void setgrupa(const int n) { grupa=n; } CGroup(const string s, const int k, const int g) { spec=s; kurs=k; grupa=g; } void addstudent(CStudent &a) { students.push_back(a); } /* int ReadFile() //3.1 { ifstream st; st.open("students.txt",ios::in); if(!st) { cout<<"Cannot open students.txt or file does not exist."<<endl; return 0; } string a, b, c; int d, e, i=0; if (st.is_open()) { do { st >> a >> b >> c; students[i].setname(a); students[i].setEGN(b); students[i].setFN(c); do { st >> d >> e; students[i].add_st_tests(d,e); }while(st.peek() != '\n' || st.peek() != '\r'); i++; }while(!st.eof()); } st.close(); }*/ double averagetest(int a) //3.2 { double sum=0; int br=0; vector<CStudent>::iterator itt; for (itt=students.begin();itt!=students.end();itt++) { map<int, int>::iterator it=(*itt).getst_tests().find(a); while(itt!=students.end()) sum+=it->second; br++; } cout<<sum/br; return sum/br; } list<CStudent> averageparam(const int a, const int b) //3.3 { list<CStudent> l; int i=0; vector<CStudent>::iterator itt=students.begin(); for (itt=students.begin();itt!=students.end();itt++) { if((*itt).average() >= a && (*itt).average() <= b) l.push_back(*itt); i++; } cout<<"List ot studenti sus sreden broi tochki mejdu "<<a<<" - "<<b<<endl; list<CStudent>::iterator it=l.begin(); for (it=l.begin();it!=l.end();it++) (*it).print(); return l; } int averageabove(const int a) //3.4 { int br=0; vector<CStudent>::iterator itt=students.begin(); for (itt=students.begin();itt!=students.end();itt++) if((*itt).average() > a) br++; cout<<"Broi studenti sus sreden broi tochki nad "<<a<<": "<<br<<endl; return br; } void averageage(const int a) //3.5 { cout<<"Sreden uspeh na "<<a<<" godishni studenti."<<endl; vector<CStudent>::iterator itt=students.begin(); for (itt=students.begin();itt!=students.end();itt++) { int b=(*itt).getAge(); if(a == b) cout<<(*itt).getname()<<" "<<(*itt).average()<<endl; } } void beststudent() //3.6 { cout<<"Student s nai-visoka uspevaemost."<<endl; CStudent temp; vector<CStudent>::iterator itt=students.begin(); for (itt=students.begin();itt!=students.end();itt++) if ((*itt).average() > temp.average()) temp = (*itt); temp.print(); } void sortaverage() //3.7 { sort(students.begin(),students.end(),CStudent()); } void sortasc() //3.8 { } void averageage() //3.9 { } }; int main() { CStudent p1("Ivan","9711156070","61360140"); CStudent p2("Petar","9703041020","61360127"); CStudent p3("Mihail","9708032540","61360134"); p1.add_st_tests(1,55); p1.add_st_tests(2,80); p1.add_st_tests(3,69); p2.add_st_tests(1,98); p2.add_st_tests(2,25); p2.add_st_tests(3,56); p3.add_st_tests(1,32); p3.add_st_tests(2,87); p3.add_st_tests(3,57); CGroup g1 ("SIT",1,1); g1.addstudent(p1); g1.addstudent(p2); g1.addstudent(p3); g1.averagetest(2); }  
      Имам малък проблем с програмата .Успешно се  Build -ва , не изкарва грешки .А като се Run - не ми изписва map set iterator not dereferencable  също така и standard c++ libraries out of range && 0 .  Може ли някой да помогне ? Благодаря предварително
       
       Ето го и условието :
       
      1. Да се дефинира абстрактен клас CPerson, с член данни име и ЕГН, освен необходимите методи, да се напишат и следните:
      абстрактен метод за печат
       
      метод, който връща възрастта на човека на база на ЕГН-то
       
      2. Да се дефинира клас CStudent наследник на CPerson, съхраняващ информацията за факултетен номер на студента и контейнер съхраняващ резултатите на студента от различни тестове (код на теста и получения брой точки, напр. (map<unsigned, unsigned> st_tests). Освен необходимите конструктори, методи и оператори (сред които е функцията за печат) да се добавят:
       
      метод, който връща средния брой точки получени от студента
       
      метод, който връща брой точки по код на тест, подаден като параметър
       
      3. Да се дефинира клас група студенти CGroup, съхраняващ информацията за специалност, курс, група и контейнер от студентите в нея (напр. vector<CStudent>). Освен необходимите методи, да се реализират и следните член функции:
       
      да се дефинира конструктор с параметър име на файл, съдържащ необходимата информация за запълване на контейнера
       
      изчислява и връща средния брой точки за тест, подаден като параметър
       
      връща списък от студенти (list<CStudent*>) със среден брой точки принадлежащи на интервал [a;b] (a,b - параметри)
       
      изчислява и връща броя на студентите със среден брой точки, по-голям от числото подадено като параметър
       
      изчислява и връща средния брой точки на студентите на възраст, подадена като параметър
       
      намира студента с най-висока успеваемост на тестовете
       
      сортира студентите по среден брой точки
       
      сортира тестовете в низходящ ред по среден брой точки, получени от студентите в групата
       
      изчислява средната възраст на студентите от групата
       
      4. Да се създадат няколко обекта от класа CGroup и се демонстрира работоспособността на методите му като се направят различни справки и съпоставки между тях (напр. коя специалност има по-висока средна успеваемост на тестовете, коя по-висока средна възраст, коя повече студенти получили точки над зададена стойност). Да има обработка на изключения на необходимите места.
    • от barry
      Здравейте,
      имам един масив от цели числа
      int a[] = {1, 2, 3, 4, 5, 6}; а израза
      (1 + 3)[a] - a[0] + (a + 1)[2] е равен на 8. По принцип i-тия елемент на масива е
      a[i] или *(a+i) но не разбирам другите две конструкции. Може ли някой да обясни как се изчисляват те?
      Благодаря предварително.
    • от martin stoqnov
      Здравейте!от скоро се занимавам с онлайн симулатор на ардуино "Tinkercad" ,но имам някой проблеми с логическото изпълнение на кодовете.
      ето и част от първият 
       if (digitalRead(Zaqvka2) == HIGH)
      {
      switch (i){
      case 0:
      digitalWrite(Up,HIGH);
      digitalWrite(Fast,HIGH);}
      }                                                     тук проблема идва от това, че без да е изпълнено условието за If (zaqvka da e HIGH)   се изпълнява оператора switch ?!?
      друг проблем който срещнах е  ,че когато не е изпълнено условие за if  не се изпълнява else частта. 
      Ще се радвам ако някой сподели дали е имал проблем с средата и да каже този код дали върви нормално в реални условия с контролер и др-те физически елементи.
      Започвам да си мисля, че средата е боза ?!?
       

    • от Pepi Litkov
      Здравейте колеги ! Спешно ми трябва една задача написана на C++ за понеделник . Много ми е труден този език и не мога да измисля никакъв код ..Ако е възможно погледнете условието : Да се напише програма,която за дадено естествено число N да намира такава тройка числа a,b,c (естествени и c<N), за която a2+b2=c2 (двойките са степен).. Благодаря ви много предварително ! 
  • Разглеждащи в момента   0 потребители

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

  • Дарение

×

Информация

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