Algorytm Losowania

waldeq

Użytkownik
Dołączył
Styczeń 21, 2007
Posty
70
Chciałbym się spytać czy zna ktoś może jakiś dobry algorytm losowania. Nie chodzi mi o coś typu funkcja rand() i takie, które korzystają z czasu, ponieważ ciąg wylosowanych wartości notorycznie się powtarza. Będę wdzięczny jeśli ktoś poda mi odpowiedź. :nauka:
 

TsEp0

Użytkownik
Dołączył
Listopad 5, 2007
Posty
38
Originally posted by waldeq
Nie chodzi mi o coś typu funkcja rand() i takie, które korzystają z czasu, ponieważ ciąg wylosowanych wartości notorycznie się powtarza.
Do tego trzeba dopisać polecenie "randomize" czy jakoś tak i wtedy powinno działać.
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
rand.h
Kod:
#include <windows.h>

#include <wincrypt.h>



void myRand(void *variable){

    HCRYPTPROV m_hProv;

    CryptAcquireContext(&m_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);

    CryptGenRandom(m_hProv, sizeof(LONG), reinterpret_cast<LPBYTE>(variable));

    CryptReleaseContext(m_hProv, 0);

}
main.cpp
Kod:
#include <iostream>

#include <stdlib.h>

#include "rand.h"



int main(int argc, char *argv[]){

    for(int i=0; i<20; i++){

        LONG random;

        myRand(&random);      

        std::cout<<random<<std::endl;

    }

    getchar();

}
Kompilowałem pod Dev i działa - jest zawsze losowo, nie powtarza sie.
 

waldeq

Użytkownik
Dołączył
Styczeń 21, 2007
Posty
70
No wylosowany ciąg się nie powtarza ale jednak potrzebuję jeszcze coś takiego bym miał możliwość losowania liczby z wybranego przedziału (w miarę szybko bo szybkość jest tutaj bardzo ważna). Jakieś odpowiedzi??
 

eloar

Użytkownik
Dołączył
Listopad 28, 2006
Posty
58
Losowanie z przedzialu robi sie poprzez dzielenie modulo. Wylosowana liczbe dzielisz modulo 'dlugosc przedzialu'. Jesli zakres jest odsuniety od zera wystarczy dodac(odjac) przesuniecie od wyniku.

Kod:
wynik=rand()%10;  //zakres [0;9]

wynik=(rand()%10)+1;  //zakres [1;10]
To na pewno bedzie dzialac i dla tak skomplikowanych konstrukcji.
 

waldeq

Użytkownik
Dołączył
Styczeń 21, 2007
Posty
70
Ok wreszcie udało mi się zabrać za to losowanie i odpowiednio przerobiłem sobie kod RobertaG z wykorzystaniem rekurencji. Działa bez zarzutu. Dla wszystkich co podpowiedzieli daję pomógł.
Kod:
int GetRandom(int min, int max)

{

    int n;

    int *number=&n; 

    HCRYPTPROV m_hProv;

    CryptAcquireContext(&m_hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);

    CryptGenRandom(m_hProv, sizeof(LONG), reinterpret_cast<LPBYTE>(number));

    CryptReleaseContext(m_hProv, 0);

    *number %= max;

    

    if (*number < min)

    {

       *number += (min - *number);

       *number += GetRandom(0, max - min);

    }

    

    return *number;

}
 
Do góry Bottom