2017-01-02 1 views
-1

Ich wollte wissen, ob es eine Möglichkeit gibt, zufällige posix :: time aus dem Bereich von jetzt bis 10 Tage zurück zu generieren?Gibt es einen effizienten Weg, zufällige date_time vom Bereich bis zu 10 Tagen zurück zu generieren?

Ich dachte an so etwas wie:

using namespace boost::posix_time; 
second_clock now = second_clock::local_time(); 
second_clock back = now - hours(240); 

Dadurch I lokales Datum und das Datum 10 Tage zurück, hätte aber wie kann ich einiges zufälliges Datum aus dieser Zeit erzeugen? Ich weiß, das ist wahrscheinlich so einfach wie es sein könnte, aber ich habe keine Ideen mehr;/

+4

Entschuldigung, wenn ich falsch verstanden habe, aber warum ersetzen Sie '240' nicht einfach durch eine zufällig generierte Ganzzahl? – jogojapan

Antwort

-1

Wenn ich Sie richtig verstehe, wollen Sie einen zufälligen Zeitstempel zwischen heute und 10 Tage zurück bekommen.

Ich würde Ihnen empfehlen, 10 Tage in Millisekunden zu nehmen und wählen Sie einfach eine zufällige Zahl in diesem Bereich und subtrahieren Sie es für den Zeitstempel.

Leider kann rand keine so große Zufallszahl generieren. Daher können Sie einen solchen Zeitstempel in Teilen erstellen und den aktuellen Zeitstempel davon subtrahieren.

unsigned int days_in_milli, hrs_in_milli, mins_in_milli, secs_in_milli, num_milli_back; 
srand(time(NULL)); 
num_milli_back = rand() % 1000; 

days_in_milli = (rand() % 10) * 86400000; 
hrs_in_milli = (rand() % 24) * 3600000; 
mins_in_milli = (rand() % 60) * 60000; 
secs_in_milli = (rand() % 60) * 1000; 

cout << ((unsigned)time(NULL) - (days_in_milli + hrs_in_milli + mins_in_milli + secs_in_milli + num_milli_back)) << endl; 

Hoffnung, die hilfreich war

1

Ich empfehle einen uniform_int_distribution verwenden und einen generischen Nutzen machen, die zufällige Zeitstempel Generatoren für verschiedene Zeitfenster erstellen:

Live On Coliru

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <iostream> 
#include <random> 

using boost::posix_time::ptime; 
using boost::posix_time::minutes; 
using boost::posix_time::seconds; 
using boost::posix_time::hours; 

int main() { 
    auto rng = std::mt19937 { std::random_device{}() }; // correctly seeded random generator 

    auto date_selector = [&](boost::posix_time::time_duration window = boost::posix_time::hours(24*10), ptime now = boost::posix_time::second_clock::local_time()) { 
     auto start = now - window; 
     unsigned size = (now - start).total_seconds(); 
     return [=]() mutable { 
      return start + seconds(std::uniform_int_distribution<unsigned>(0,size)(rng)); 
     }; 
    }; 

    auto seven_days = date_selector(hours(7*24)); 
    std::cout << "seven_days:\n"; 
    for (auto i = 10; i; --i) std::cout << "\t" << seven_days() << "\n"; 

    auto ten_minutes = date_selector(minutes(10)); 
    std::cout << "ten_minutes:\n"; 
    for (auto i = 10; i; --i) std::cout << "\t" << ten_minutes() << "\n"; 
} 

Drucke, z

seven_days: 
    2016-Dec-27 22:32:13 
    2016-Dec-30 10:02:14 
    2016-Dec-27 13:14:59 
    2016-Dec-29 22:44:16 
    2016-Dec-30 17:28:37 
    2016-Dec-31 05:21:38 
    2017-Jan-01 10:33:44 
    2017-Jan-01 06:50:51 
    2016-Dec-28 09:52:12 
    2016-Dec-29 12:35:50 
ten_minutes: 
    2017-Jan-02 13:34:52 
    2017-Jan-02 13:38:25 
    2017-Jan-02 13:34:19 
    2017-Jan-02 13:37:44 
    2017-Jan-02 13:38:51 
    2017-Jan-02 13:39:34 
    2017-Jan-02 13:41:18 
    2017-Jan-02 13:41:05 
    2017-Jan-02 13:35:32 
    2017-Jan-02 13:37:08 
Verwandte Themen