CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Losowa liczba

Losowa liczba

dział ogólny

Losowa liczba

Nowy postprzez nvdante » poniedziałek, 13 lutego 2012, 13:46

Witam

Kolejne wyzwanie, kolejny problem ;)

Czemu wywołanie poniższego kodu powoduje losowanie jakiejś liczby, ale TYLKO raz na sekundę, a nie na przykład raz na naciśnięcie przycisku?
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
srand(time(0));
int x = rand() % 110;
Label1->Caption = x;
}

Jak to poprawić?

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez polymorphism » poniedziałek, 13 lutego 2012, 14:27

Czemu wywołanie poniższego kodu powoduje losowanie jakiejś liczby, ale TYLKO raz na sekundę

Dlatego, że time zwraca czas w sekundach. Funkcja srand inicjuje generator liczb losowych, nie powinna być wywoływana za często. Twój kod co każde losowanie reinicjuje generator, który przy takim samym ziarnie da tą samą liczbę przy losowaniu. Daj wywołanie srand do konstruktora formy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez nvdante » poniedziałek, 13 lutego 2012, 14:48

Ustawiłem Form1 OnCreate na srand(time(0)), ale bez zmian ( chyba, że źle Cię zrozumiałem z tym konstruktorem formy ).
Ogólnie powiem, że potrzebuje takiego losowania, aby gdy ktoś kliknie dwa razy to nie dostał dwa razy tej samej liczby, bo wtedy wyniki wyjdą nieprawidłowe.

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez polymorphism » poniedziałek, 13 lutego 2012, 15:10

A usunąłeś wywołanie srand z Button1Click?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez nvdante » poniedziałek, 13 lutego 2012, 15:13

hmmm ... mam taki kod w Button1, w OnCreate, wiesz co jest:
randomize();
int x = rand() % 110;
Label1->Caption = x;
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez polymorphism » poniedziałek, 13 lutego 2012, 15:32

A co to randomize tam robi?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez nvdante » poniedziałek, 13 lutego 2012, 15:34

Hehehe ... psuje :P
A tak po prawdzie to myślałem, że jest konieczne, bo wywołanie skopiowałem od Barona.
Już poprawiłem i działa świetnie - dziękuję :)

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez Cyfrowy Baron » poniedziałek, 13 lutego 2012, 18:01

nvdante napisał(a):bo wywołanie skopiowałem od Barona.


Funkcja randomize ma takie samo zastosowanie jak srand, czyli uruchamia generator liczb losowych. Funkcja randomize używa się w połączeniu z funckją losującą random, a nie srand, podobnie funkcji srand używa się z funkcją losującą rand



Alternatywą jest funkcja Randomize (pisana z wielkiej litery) uruchamiająca generator liczb losowych w oparciu o zegar systemowy, w połączeniu z funkcją losującą Random( int ARange ) - gdzie ARange to zakres liczb do wylosowania 0 - ARange.

KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Randomize();
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int X = Random( 110 );
 Label1->Caption = (string)X;
}


nvdante napisał(a):że potrzebuje takiego losowania, aby gdy ktoś kliknie dwa razy to nie dostał dwa razy tej samej liczby, bo wtedy wyniki wyjdą nieprawidłowe.


Funkcja losująca może dwa razy wylosować tą samą liczbę. To jest losowanie, jak zapewne się orientujesz, jeżeli rzucisz 6 razy kostką sześcioboczną to teoretycznie możesz 6 razy wylosować tą samą liczbę.



nvdante napisał(a):
KOD cpp:     UKRYJ  
Label1->Caption = x;


Nie przypisuj bezpośrednio wartości typu integer tam gdzie oczekiwany jest łańcuch znaków. Używaj konwersji:

KOD cpp:     UKRYJ  
Label1->Caption = (String)x;


lub:

KOD cpp:     UKRYJ  
Label1->Caption = IntToStr(x);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez nvdante » wtorek, 14 lutego 2012, 01:25

Cyfrowy Baron napisał(a):Funkcja randomize ma takie samo zastosowanie jak srand, czyli uruchamia generator liczb losowych. Funkcja randomize używa się w połączeniu z funckją losującą random, a nie srand, podobnie funkcji srand używa się z funkcją losującą rand


Chcesz zatem powiedzieć, że taki kod jest nieprawidłowy?
KOD cpp:     UKRYJ  
srand(time(0));
randomize();
int x = rand() % 110;
 

Jeśli tak, to poproszę Cię o poprawienie tego na swojej stronie, a dokładniej TUTAJ

Cyfrowy Baron napisał(a):Funkcja losująca może dwa razy wylosować tą samą liczbę. To jest losowanie, jak zapewne się orientujesz, jeżeli rzucisz 6 razy kostką sześcioboczną to teoretycznie możesz 6 razy wylosować tą samą liczbę.


Oczywiście, źle to napisałem, chodziło o występowanie tej samej liczby w tej samej sekundzie, co już mam za sobą :)

Cyfrowy Baron napisał(a):Nie przypisuj bezpośrednio wartości typu integer tam gdzie oczekiwany jest łańcuch znaków. Używaj konwersji:

KOD cpp:     UKRYJ  
Label1->Caption = (String)x;


lub:

KOD cpp:     UKRYJ  
Label1->Caption = IntToStr(x);

Pewnie masz rację, ale czy jest jakieś uzasadnienie? Czy
KOD cpp:     UKRYJ  
Label1->Caption = x;

nie spowoduje tego samego co
KOD cpp:     UKRYJ  
Label1->Caption = (String)x;

Naprawdę jest to istotne?

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Losowa liczba

Nowy postprzez Cyfrowy Baron » wtorek, 14 lutego 2012, 16:05

nvdante napisał(a):Naprawdę jest to istotne?


W tym konkretnym przypadku nie, gdyż zachodzi tutaj konwersja nie jawna. Jednak w pewnych sytuacjach może to doprowadzić do błędów, jak np:

KOD cpp:     UKRYJ  
 int x = 10;
 Edit1->Text = "Wylosowano liczbę: " + x;


Nie wiem jak w BCB6, ale w C++BUilder 2010, spowoduje to wyświetlenie w Edit1 tekstu liczbę, gdyż zamiast dodania zmiennej x jako łańcucha znaków, zostanie obcięty łańcuch znaków "Wylosowano liczbę" o 10 znaków. W starszych wersjach środowiska może dać to inne efekty.

Dlatego by się później nie pogubić w kodzie, dobrze jest stosować konwersję jawną. Wyeliminujesz w ten sposób potencjalne błędy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Losowa liczba

Nowy postprzez nvdante » wtorek, 14 lutego 2012, 16:57

Ha, faktycznie ... BCB6 po skompilowaniu jako wynik podał jedynie napis " liczbę" pomijając resztę danych.
Dodanie konwersji spowodowało wyświetlenie tego co trzeba.
Postaram się o tym pamiętać, dziękuję :)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron