srand(time(NULL)); sorunu

Başlatan Recep METE, 29 Aralık 2014, 20:28:36

Recep METE

Yaptığım zar çalışmasında rand'ın zamana bağlı olarak farklı sayılar üretmesi için  "srand(time(NULL));" ekledim ancak derleyici bu kodu hata olarak gösreriyor.Derlemiyor.Çok uğraşmama rağmen bu sorunu bir türlü düzeltemedim.Kodu ve sorunun resmini aşağıya yüklüyorum.Acaba nerede hata yaptım.Yorumlarınızı bekliyorum.

#include <16f877.h>     
#include<stdio.h>

#include<time.h>
                                                                                                                                                                                            
#include<stdlib.h>                                                           
                                        
//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   


#use fast_io(a) 
#use fast_io(b) 


char birler=0;

// Ortak katot display için veri değerleri

const int eda[6]={0x20,0x10,0x08,0x04,0x02,0x01,};
const int recep[6]={0x01,0x02,0x04,0x08,0x10,0x20};
const int nihat[6]={0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,};
int i,a=0;
   
   #int_timer0
void timer_kesme(void)
{
      set_timer0(0);
   
   if(input(pin_a0)){ delay_ms(5);while(input(pin_a0));
   for(i=0;i<=5;i++){
         output_b(recep[i]);
         delay_ms(50); 
   }

for(i=0;i<=5;i++){
         output_b(recep[i]);
         delay_ms(100); 

}

for(i=0;i<=5;i++){
         output_b(recep[i]);
         delay_ms(150); 
}

for(i=0;i<=5;i++){
         output_b(recep[i]);
         delay_ms(200); 
}
    srand(time(NULL));
     birler =rand()%6;
              
      output_b(nihat[birler]); // displaye bilgi gönderiliyor
     
             delay_ms(1000);
   }
}  
void main ()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|T0_8_BIT);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı


set_timer0(0);

   enable_interrupts(int_timer0);
   enable_interrupts(global);

   set_tris_a(0x01);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor
    output_b(0x00);  // B portu çıkışları sıfırlanıyor
 output_a(0x02);
   while(1)
   {
   
   for(i=0;i<=5;i++){
         output_b(eda[i]);
         delay_ms(100); 
   }
}

  }

                
  
   




printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

oyaz

Become a learning machine...

iruraz

srand(time(NULL));


satırını "main" içine alıp dener misiniz?

mir_as82

#3
Senin .obj kütüphane dosyalarinin oldugu yerde time.h in implementasyon dosyasi yok. Ondan hata veriyor olabilir mi?

İkinci olarak time.h i en üstte tanımlar misin.

Recep METE

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

aliveli


Recep METE

#6
Alıntı yapılan: iruraz - 29 Aralık 2014, 22:28:01
srand(time(NULL));


satırını "main" içine alıp dener misiniz?

Hocam main in içinde değişik yerlerde denedim yine olmadı.

mesaj birleştirme:: 30 Aralık 2014, 13:18:43

Alıntı yapılan: aliveli - 29 Aralık 2014, 23:15:13
katliam yapmışsın

Ne gibi? Anlayamadım.

mesaj birleştirme:: 30 Aralık 2014, 13:41:37

Alıntı yapılan: mir_as82 - 29 Aralık 2014, 22:48:07
Senin .obj kütüphane dosyalarinin oldugu yerde time.h in implementasyon dosyasi yok. Ondan hata veriyor olabilir mi?

İkinci olarak time.h i en üstte tanımlar misin.

Hocam time.h en üstte tanımladım yine olmadı.Ayrıca drivers klasöründe(ccs c) time.h dosyası mevcuttur.

mesaj birleştirme:: 29 Aralık 2014, 23:53:28

"srand(time(NULL)); "kod bu şekildeyken derleyici derlemiyor.Ama kodda şöyle bir değişiklik yapınca "srand(NULL);" derliyor.Fakat bu sefer zar programında sürekli "1" gözüküyor.1'den 6 'ya kadar olan rakamlar gözükmüyor.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

aliveli

o kadar kod ,delay kesmede olmaz main yerine geçmiş neredeyse
pic saatin kaç olduğunu bilmez

srand(get_rtcc()); dene

iruraz

#8
Alıntı Yap
"srand(time(NULL)); "kod bu şekildeyken derleyici derlemiyor.Ama kodda şöyle bir değişiklik yapınca "srand(NULL);" derliyor.Fakat bu sefer zar programında sürekli "1" gözüküyor.1'den 6 'ya kadar olan rakamlar gözükmüyor.

"srand" rasgele sayı üretecini (yani "rand()") besler. ANSI-C 'de, örneğin pc 'de "srand(time(NULL))" dediğimizde sistemden o anki saniye değerini alıp (yanlış hatırlamıyorsam 1 Ocak 1970 'ten beri geçen) "rand()" fonksiyonunu besleyerek her seferinde farklı değer üretilmesini sağlar(çünkü zaman sürekli değişmektedir).

"srand(NULL)" dediğiniz zaman "rand()" fonksiyonu "NULL" ile beslenir (yani sıfır ile) ve bu yüzden hep aynı değeri üretir.

CCS-C 'de srand(time(NULL)) 'un çalışmama sebebi bir değer alacağı kaynağın (pc 'deki zaman gibi) olmaması olabilir mi? time ama hangi time?

mesaj birleştirme:: 30 Aralık 2014, 00:20:08

geçen sene de aynı sorunla karşılaşmışsınız galiba :)

https://www.picproje.org/index.php?topic=49742.0

Burak B

#9
Son kez yazıyorum "mersenne twister" kullanın. Bunu bu forumda 3 veya 4. kez yazışım ve aranızda hiç kimse kaale alıp nedir diye bakmadı bile. Hala srand() olmadı xrand() olurmu soruyorsunuz. E o zaman siz buna müstahaksınız. :) Google da arasanız 5-6. başlık size mersenne twister PRNG C fonksiyonu için link verecek.

Yeri gelmişken şunu da yazayım sistem tick timer veya herhangi bir saat fonksiyonunu baz alan rastgele sayı üreten fonksiyonlar tahmin edilebilir olurlar. Çünkü entropyleri bellidir ve kendilerini tekrar ederler.

Buna örnek olarak geçmişte RSA-1024 kullanan bir yazılımın bu gibi Win32 GetSysTickTimer() fonksiyonunu random seeder olarak kullanması yüzünden kırılmış(key üretilerek) olması verilebilir.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

aliveli

adam altı üstü yedi segmente zar yapacak tahmin edilse ne edilmese ne

Recep METE

Alıntı yapılan: aliveli - 30 Aralık 2014, 11:22:20
adam altı üstü yedi segmente zar yapacak tahmin edilse ne edilmese ne

ccs c 'de "srand" fonksiyonunu öğrenmeye çalışıyorum.Yoksa ben bunu yaparak para kazanacak değilim.Bu alaycı ve çözüm üretmekten uzak tavırlarıdan uzaklaşman dileğiyle...
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mir_as82

Hocam sen değil hepimiz öğreniyoruz. Senin sorun aslında hepimizi geliştiriyor. Onun için her soru değerlidir.

iruraz

Alıntı yapılan: mir_as82 - 30 Aralık 2014, 12:19:58
Hocam sen değil hepimiz öğreniyoruz. Senin sorun aslında hepimizi geliştiriyor. Onun için her soru değerlidir.

Aynen katılıyorum hocam.

Salih

@Semfero Şöyle bir kod denedim.
Sonuçlar iyi gibi, tekrar sayısı makul düzeyde, bir incele istersen.
While(True)   
   {                
      zar = (rand()%6)+1;
      printf("Zar=%u\r\n",zar);
      srand(say++);
      delay_ms(500);
   }

Sonuçlar



Zar=4                                                         
Zar=1                                                         
Zar=3                                                         
Zar=4                                                         
Zar=1                                                         
Zar=6                                                         
Zar=2                                                         
Zar=4                                                         
Zar=6                                                         
Zar=5                                                         
Zar=1                                                         
Zar=3                                                         
Zar=5                                                         
Zar=4                                                         
Zar=1                                                         
Zar=2                                                         
Zar=4                                                         
Zar=4                                                         
Zar=6                                                         
Zar=1                                                         
Zar=4                                                         
Zar=3                                                         
Zar=5

Zar=6                                                         
Zar=3                                                         
Zar=2                                                         
Zar=4                                                         
Zar=6                                                         
Zar=2                                                         
Zar=1                                                         
Zar=4                                                         
Zar=5                                                         
Zar=1                                                         
Zar=6                                                         
Zar=3                                                         
Zar=4                                                         
Zar=6                                                         
Zar=6                                                         
Zar=1                                                         
Zar=3                                                         
Zar=3                                                         
Zar=5                                                         
Zar=6                                                         
Zar=3                                                         
Zar=2                                                         
Zar=4

Zar=5                                                         
Zar=2                                                         
Zar=1                                                         
Zar=3                                                         
Zar=5                                                         
Zar=1                                                         
Zar=6                                                         
Zar=3                                                         
Zar=4                                                         
Zar=6                                                         
Zar=6                                                         
Zar=2                                                         
Zar=3                                                         
Zar=5                                                         
Zar=5                                                         
Zar=1                                                         
Zar=2                                                         
Zar=5                                                         
Zar=4                                                         
Zar=6                                                         
Zar=2                                                         
Zar=4                                                         
Zar=3                                                         
Zar=6                                                         
Zar=1                                                         
Zar=3