Önceki başlık :: Sonraki başlık |
Yazar |
Mesaj |
DarkScythe
Kayıt: Aug 04, 2005 Mesajlar: 173 Nereden: Vault 35
|
Tarih: Fri Sep 09, 2005 1:50 pm Mesaj konusu: Rasgele sayı sorunu |
|
|
tüm dillerde böyle bir sorun var mı bilmiyorum , benim c# da karşıma çıktı , sürekli random sayı istiyorum ve ekrana yazdırıyorum mesela ve sonuç şöyle: 2222555588883333000055556666 fln gibi yani arka arkaya 2 tane random sayı isteyince aynı sayıyı veriyor sebebinide netten araştırdım , siz rasgele bir sayı isteyince sistem saaatinin o anki milisecond değeri yani mesela saat 14:30:12,348 ise size 8 sayısını veriyo , yeni sistemlerde çok hızlı olduğu için saniyenin binde birinde 3-5 kere işlem yapınca aynı sayıyı tekrar veriyo , buna bir çözüm önerisi getirebilecek var mı yani arka arkaya 2 sayı istediğimde aynı sayılar değil yine rasgele bi sayı gelecek |
|
Başa dön |
|
|
levent
Kayıt: Mar 13, 2003 Mesajlar: 188 Nereden: İstanbul
|
Tarih: Fri Sep 09, 2005 2:06 pm Mesaj konusu: |
|
|
random sayının peş peşe aynı çıkması sanırım genel bir durum ve çözümü bildiğim kadarıyla "randomize" türü fonksiyonlardan geçiyor (vb ve delphide böyleydi.)
c#'ta ise VBMath kütüphanesi yardımıyla Randomize'ı kullanabilirsin sanırım.
ama güzelim c# kodan vb bulaştırmaya değer mi bilmiyorum.
belki başka bir yol bilen vardır.
Kod: |
double r;
Random randObj;
//mesela buraya olabilir
VBMath.Randomize(); //parametere olarak seed girilebilir.
r=randObj.Next( );
|
*:aslında aklıma geldi de c#'taki random classı tamamen rasgele sayı üretecek fonksiyonlara da sahip olabilir. |
|
Başa dön |
|
|
HakanNehir
Kayıt: Mar 22, 2004 Mesajlar: 60
|
Tarih: Fri Sep 09, 2005 2:59 pm Mesaj konusu: |
|
|
iki öneri:
öneri 1:
int öncekisayi; //global değişken
void RastgeleSayi(){
int rastgelesayi;
Loop
rastgelesayi = random()*10; //0-9 arası
While rastgelesayi == öncekisayi;
öncekisayi = rastgelesayi;
}
öneri 2
void RastgeleSayi()
{
int ratgelesayi, i;
for (i=0; i<5; i++)
{
rastgelesayi += random()*10; //0-9 arası
}
rastgelesayi /= 5;
} |
|
Başa dön |
|
|
DarkScythe
Kayıt: Aug 04, 2005 Mesajlar: 173 Nereden: Vault 35
|
Tarih: Fri Sep 09, 2005 3:21 pm Mesaj konusu: |
|
|
cevaplar için saolun hakan arkadaşım 1. yöntemini bende denemiştim başka benzer yöntemleride denedim sonuç alınıyo ama performans sorunları yaratıyo , pek stabil olmuyo anlıcan , c++ bilen arkadaşlar VB deki randomize tarzı bi olay c++ dada var mı acaba yoksa c++ da çözümü nedir , nie c# ta böyle bir eksiklik var anlamadım şimdi |
|
Başa dön |
|
|
Ziyaretci
Kayıt: Apr 24, 2003 Mesajlar: 287 Nereden: İstanbul
|
Tarih: Fri Sep 09, 2005 3:47 pm Mesaj konusu: |
|
|
normalde rasgele sayı classları SADECE ilk defasında Sistem timer ina ulaşır. Daha sonraki sayılar, pseudo-random sayıların tipik özelliği olarak bir önceki sayıya bağlı üretilir.
Eğer sürekli timer a ulaşıyorsan bir hata yapıyorsun demektir...
kodunu tekrar incele derim.. |
|
Başa dön |
|
|
ayberk_cerit
Kayıt: Aug 13, 2004 Mesajlar: 51 Nereden: Avdan'dan geliyor elinde desdi,kız kurban olduğum sana kim küstü ...
|
Tarih: Fri Sep 09, 2005 3:51 pm Mesaj konusu: |
|
|
.NET Framework System.Security.Cryptography.RandomNumberGenerator sınıfına bi bak istersen... |
|
Başa dön |
|
|
ferdemoncel
Kayıt: Nov 03, 2003 Mesajlar: 277 Nereden: Eskişehir
|
Tarih: Fri Sep 09, 2005 4:02 pm Mesaj konusu: |
|
|
Evet tabi ki var. Bu konu uzun uzun CDili grubunda tartışılmıştı.
Ben de aslında basit gibi görünen bu konunun aslında o kadar da basit olmadığını öğrenmiştim.
Biraz uzun bir thread olsa da adresi:
http://groups.yahoo.com/group/cdili/message/3918
Bunun için ya time işlevini ya da Windows'un GetTickCount işlevini kullanabilirsiniz. Sanırım şunun gibi bir şeyler olabilir:
Kod: |
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;
int rastgeleSayi(int n)
{
const unsigned aralik_genisligi = ((unsigned)(RAND_MAX)+1) / n;
int r;
do r = rand() / aralik_genisligi;
while (r >= n);
return r;
}
int main ()
{
// srand (time (NULL));
srand (GetTickCount ());
int sayi = rastgeleSayi (10);
cout << sayi;
return 0;
}
|
|
|
Başa dön |
|
|
ebleda
Kayıt: Dec 30, 2004 Mesajlar: 183 Nereden: usa
|
Tarih: Fri Sep 09, 2005 4:09 pm Mesaj konusu: |
|
|
Random number uretmek icin her seferinde sistem saati cagirilmaz! ilk tohumu atmak icin sistem saati kullanilir. Tohum atildiktan sonra Ziyaretci'nin dedigi gibi diger random sayilar bu tohumdan turer. Tabi ki buradaki en buyuk sorun ise random number genertor'un kalitesidir.
Bu da yapacagin uygulamaya bagli.
Bu testi yapmanin en iyi yolu ise sayilar arasindaki korolasyona bakmatir.
r(i)'ler uretilen random sayilar olmak uzere,
c(j)=sum[r(i) r(i+j), {i,N}]/N - 1/4 toplaminda,
j = 0,1,2... (tabiki burada N 'i oldukca buyuk tutmak sartiyla), eger herhangi bir periodicity olusursa c(j) sifirdan farkli bir sayi uretecektir.
Benim icin j'nin 100'e kadar cikmasini saglayan bir random number gerenator yeterli geliyor cunku onun otesinde nonlinear fiziksel sistemlerde random numberdan once fiziksel cevapta sapmalar oluyor. |
|
Başa dön |
|
|
DarkScythe
Kayıt: Aug 04, 2005 Mesajlar: 173 Nereden: Vault 35
|
Tarih: Fri Sep 09, 2005 4:31 pm Mesaj konusu: |
|
|
her seferinde time a bakılmadığıı çaktım ama nie böle oluyor
kod şöle mesela :
public static int rnd(int a,int b)
{
Random x = new Random();
int c = x.Next( a, b) ;
return c;
}
private void form_Load(object sender, System.EventArgs e)
{
for (int i=0;i<100;i++)
{
textbox.text += rnd ( 0,9 ).Tostring;
}
}
ekranda çıkan bu :
3333333333000000000006666666666668888888888.... fln |
|
Başa dön |
|
|
lucifer
Kayıt: Nov 02, 2002 Mesajlar: 215 Nereden: Istanbool
|
Tarih: Fri Sep 09, 2005 4:41 pm Mesaj konusu: |
|
|
abi... su random x = new random() satirini bi kere yapsana... her rnd dediginde cagirma onu. bence olay ordan kaynaklaniyo. |
|
Başa dön |
|
|
DarkScythe
Kayıt: Aug 04, 2005 Mesajlar: 173 Nereden: Vault 35
|
Tarih: Fri Sep 09, 2005 4:46 pm Mesaj konusu: |
|
|
lucifer hll olsun kardeşim çözdün olayı |
|
Başa dön |
|
|
|