2016-03-20 25 views
1

global değişken için tohum kaybediyor Rasgele bir sayı yakalamanın kolay bir yolunu yapmak istedim, ancak gen, rasgele sayı üretecinin işlevler boyunca tohumunu kaybetmiş gibi görünüyor. Bu örneği birden çok kez çalıştırırsanız, oluşturulan ilk rasgele sayının her koşuda rasgele olduğunu görürsünüz, ikincisi ise değil. Bunun nedeni nedir?Statik rasgele sayı üreteci

main.cpp

#include <iostream> 
#include "Random.hpp" 
class Global 
{ 
public: 
    Global() 
    { 
     Random::seed(); 
     std::cout << "\n" << Random::getRandom(-10, 10);//random 
    } 
    void Global::doStuff() 
    { 
     std::cout << "\n" << Random::getRandom(-10, 10);//not random 
    } 
}; 
Global globalInstance; 

int main() 
{ 
    globalInstance.doStuff(); 
    return 0; 
} 

Random.hpp

#pragma once 
#include <random> 
class Random 
{ 
public: 

    static void seed(); 
    static int getRandom(int minInclusive, int maxInclusive); 

private: 
    static std::default_random_engine gen; 
    static std::uniform_int_distribution<int> ints; 

}; 

Random.cpp

#include "Random.hpp" 
#include <time.h> 
std::default_random_engine Random::gen; 
std::uniform_int_distribution<int> Random::ints; 
void Random::seed() 
{ 
    gen.seed(static_cast<unsigned int>(time(NULL))); 
} 
int Random::getRandom(int minInclusive, int maxInclusive) 
{ 
    std::uniform_int_distribution<int>::param_type range(minInclusive, maxInclusive); 
    ints.param(range); 
    return ints(gen); 
} 
+0

Statik olmayan bir üyeden farklı bir statik üye gibi davranıyorsunuz, statik bir üye yaptınız. – kfsone

+0

Lütfen gönderinizi düzenleyin ve [mcve] sağlayın. –

+0

Benim hatam, minimal doğrulanabilir bir örnek vermeliydim minimal bir örnek için gittim. – user46877

cevap

1

Eğer random.cpp statik kapsamına sahip nesneler üzerinde bağlı olduğu anlaşılmaktadır gösterdi kod main.cpp'daki statik kapsamlı nesnelerden önce örnekleniyor.

Bu tanımlanmamış bir davranış. C++ standardı, farklı çeviri birimlerinden statik olarak sınıflandırılmış nesnelerin göreceli örnekleme sırasını garanti etmez.

Oluyormuş gibi görünen, uygulamanızın main.cpp'un statik nesnesini, yani random.cpp çeviri biriminde tanımlanan nesnede rastgele tohumu ayarlayan örneğini başlatmasıdır. Bu, kendi içinde, tanımlanmamış bir davranış içerir, ancak bu işlem, çökmeden, hayatta kalır.

main.cpp öğesinin statik nesnesi kullanıma sokulduktan sonra, random.cpp 'in statik nesneleri anında çıkarılır, böylece varsayılan çekirdek değerini kullanmaları için sıfırlanır.

+0

Yardımlarınız için teşekkür ederiz. Ne için uğraştığımı başarmanın bir yolu var, ki bu da Random :: getRandom'a (min, max) küresel bir erişim noktasıdır; Bu böyle başarısız olmaz mı? – user46877

+0

İşlev düzeyi statik nesnelerin ilk kez işlev kapsamının girildiği zaman başlatılmış olmasından faydalanabilirsiniz. Tüm nesnelerinizi tek bir sınıfa sarın, dahili statik nesnesine bir işaretçi döndüren bir işlevde statik olarak bildirin ve bunu çağırın. –

İlgili konular