Protonda RANDOM üretme mantığı nedir?
Ben bir denememde RANDOM sayılar üretmek istedim. Sayıları üretiyor ancak açılıştan itibaren hep aynı sırada sayılar üretiyor.(ISIS da ve gerçek devrede)
Devrede 16F628 kullandım dahili osilator ile...
Çözüm olarak üretilen sayıya TMR0 değerini üretilen sayının alt ve üst byte larına eklemeyi buldum.
Ama merak ettiğim RANDOM sayı üretmenin mantığı...
Asm veya diğer programlarda da aynımıdır?
mantığını bilmiyorum ama hep aynı sıra derken neyi kastediyorsunuz?
denedim ,
gayet random sayılar üretti .
Farklı sayılar üretiyor ancak;
gerek ISIS te gerekse de gerçek devrede
her yeniden başlatmadan sonra ürettiği sayılar hep aynı sırada
örnek: olarak 5+1 için sayılar üretiyorum
çıkanlar;
11 18 21 23 25 +11
3 4 26 30 32 +5
5 7 12 16 26 +5
bunlar ard arda yapılan seçmeler .. ISIS de çalışan devreyi kapatıp tekrar açtığımda ve gerçek devrede devreye enerji verip seçmeyi yaptığımda hep aynı sırada yukarıdaki seçilmiş değerleri elde ediyorum.
Herhalde açıklayabilmişimdir.
Programlamada Rastgale diye bir olay yoktur. Herşey Belirlidir. Değişken olan bir durumu oraya refere etmeniz gerekir. zaman gibi
Forumda random ve seed olarak aratın, önceden çok konuşuldu.
Ben random olarak üretilen sayıyı TMR0'ın anlık değeri ile topluyorum, daha iyi bir rastgelelik elde ediyorum.
Şu an kullanmadığım bir başka yöntem de eepromda sallama bazı degerler saklayıp üretilen random sayıyı bunlarla toplamak/çıkarmak/çarpmak vs.
Ben RANDOM komutu ile rastgele sayı üretiliyor diye biliyordum. Ama bu çalışmada tesadüfen hep aynı sıra ile sayı ürettiğini gördüm. Çözüm olarak TMR0 değeri ile alt byte ve üstbyte ları toplamış idim( TMR0 ı sıra ile iki ayrı değişkene aktarma suretiyle) ancak ikisi arasındaki sayı farkı hep 2 olarak kaldığından TMR1 değişkeni ile RANDOM fonksiyonunun ürettiği sayıyı toplayarak rastgele sayı üretebildiğime inanıyorum.
İlginize teşekkür ederim.
Ama yine de hala RANDOM fonksiyonu tüm dillerde aynı şekilde mi çalışıyor merak ediyorum. Eğer öyle ise "BİLGİSAYAR İLE KURA ÇEKTİK" ifadesi ne kadar doğru bundan şüpheleniyorum
Random ve seed için forumda arama yapmayı beceremedim...
Sanırım bu işlem için İngilizce olarak "Pseudo-Random" deniyor. Yani gerçek anlamda rasgele değil. Tahminimce PIC'ler timer'lardan birinden aldıkları değeri matematiksel bir işlemden geçirip rasgele sayı elde ediyorlar. Yani aslında elde edilen sayıyı bir timer değeri ile işleme sokmak da pek birşey değiştirmeyecektir, özellikle de derleyicinin kaynak olarak kullandığı timer ile kullanıcının kullandığı timer aynı ise. Ama farklı olmaları durumunda bu sayı dizisinin uzunluğu ciddi ölçüde uzayacaktır. Tahminimce dizi timer'ların alabileceği değerlerin sayısı kadar uzun olacaktır. Yani 8 bit bir timer ile dizi 256 uzunluğunda olur.
Bilgisayarlardaki durum biraz daha farklı. Bilgisayarlarda genelde 01.01.1970'ten beri geçen milisaniye değeri üzerinde bir işlem yapılır. Bu sayı büyük olduğu için sanırım PIC'lerde bu yöntem kullanılmıyor (zaten bu sayının hesabı da ayrı bir dert olurdu PIC için).
PIC'te de yine aynı tarih - saat mantığından gidilerek, RTC (DS1307 gibi mesela) kullanılan bir devrede tarih - saat değeri ve belki bir kaç tane de timer'dan türetilmiş ifade karıştırılarak oldukça rasgele sayılar üretilebilir.
Son yapmış olduğum işlem ile benim işimi görebilecek rastgele sayılar üretebiliyorum.
SEED komutu ile RANDOM kullanımında ise
SEED ile $0345 başlangıç değeri alınarak RANDOM sayı üretildiğini Help dosyasında gördüm ama bu komutlar ile kullanım yapmadım.
Önceki mesajlarımda da belirttiğim gibi RANDOM pice enerji verildikten sonra ürettirilen rastgele sayıların her açılışta aynı olmasına neden oluyor.
Büyük ihtmal ile SEED komutu Kullanınca da aynı tip sayılar üretilecek. Başlangıç değeri aynı oldu için.
Bilgisayarlarda uygulamanın değişik olması içimi rahallattı...
aynı problemi ben her üretilen sayıyı eeproma kaydedip, ilk açılışta bunu okuyup seed yaparak hallettim