[]
[Algoritma] Rastgele Sayı Üretmek
Bir matrisi rastgele boyutlu bloklara ayıracağım. Bunun için, toplamları N olan X tane rastgele pozitif tamsayı üretmem gerekiyor.
Nasıl yapsam?
Nasıl yapsam?
bunun için sistem saati alınır genelde. system clock diye alınan şey her an değişen bi sayı ve büyük bi sayıdır. bunun için bu sayıyı alıp uygun bi sayıya göre mod'unu alırsın. sonra n olana kadar alıp sürekli toplamaya devam edersin. olabilir mesela.
- tepedeki psychedelic adam (18.11.09 00:34:49)
0-N arasında random bir sayı üret. a olsun bu sayı.
N-a'ya bak, eğer 0'dan büyükse N-a ile 0 arasında bir sayı üret, N=N-a ve yeni sayı b olsun.
N-b'ye bak. Eğer 0'dan büyükse N-b ile 0 arasında...
Recursion ile yaparsın sanırım. Bu şekilde N boyutunda bir matrisi en az 1 en fazla N parçaya bölersin.
N-a'ya bak, eğer 0'dan büyükse N-a ile 0 arasında bir sayı üret, N=N-a ve yeni sayı b olsun.
N-b'ye bak. Eğer 0'dan büyükse N-b ile 0 arasında...
Recursion ile yaparsın sanırım. Bu şekilde N boyutunda bir matrisi en az 1 en fazla N parçaya bölersin.
- crown (18.11.09 00:44:58)
Söylemeyi unutmuşum, seed'li olacak zaten, pseudo-random.
1 ile (N-X) arasında bir sayı üreterek başlasam daha doğru olacak sanırım, çünkü X tane sayı olmak zorunda ki X tane bloğa bölebileyim.
1 ile (N-X) arasında bir sayı üreterek başlasam daha doğru olacak sanırım, çünkü X tane sayı olmak zorunda ki X tane bloğa bölebileyim.
- fadetoreality (18.11.09 00:53:07)
ben x'i herhangi bi sayı olarak düşünmüştüm. n belli olan sayı, x de bilinmeyen için kullanılır ya genelde. aklım oraya kaymış. yine x - 1 tane random sayı bulup toplayıp sonuncusunu da n-x yapabilirsin o zaman mesela. yine mi yanlış anladım bilmiyorum ama. o x-1 içindeki sayıları da toplamları n'i geçmicek şekilde filan bulman lazım tabi. sen de herhalde bunun için bi yöntem soruyodun herhalde yine yanlış anlamadıysam. neyse zaten bişeyler yapmaya karar verdin herhalde, ben daha fazla konuşmıyım.
- tepedeki psychedelic adam (18.11.09 01:34:38 ~ 01:39:43)
merhabalar kolay gele
oncelikle crown un ve tepedeki psychedelic adamin urettigi algoritmalarda bir sorun var zannederim.
Bu algoritmalarda ilk uretilen sayilar sonraki uretilen sailardan daha buyuk olma egiliminde,
bu algoritmayi yazdim ve N=1000 X=30 icin uyguladim
(not: burada X i parca sayisi olarak aliyorum yani sana toplami 1000 eden 30 sayi uretecek bu algoritma. Bu 30 sayida sira ile sutunlarin genisligi olacak, Not bu algoritmayi sadece durumu gostermek icin yazdigimdan 0 genisligindeki sutunlari eleyecek bir seyler eklemedim algoritmaya)
bu algoritma (matlab da yazilmis)
clear all
clc
N=1000
X=30
u=[];
for(i=1:(X-1));
u(i,1)=round(N*rand(1));
N=N-u(i,1);
end
u=[u;N];
u'
bu da programin ciktisi
Columns 1 through 13
669 63 99 78 89 0 2 0 0 0 0 0 0
Columns 14 through 26
0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 27 through 30
0 0 0 0
sayilarin giderek kuculdugunu gorebilirsin.
altarnatif ise soruyu biraz farkli ele almak
bu soru elinde N atne bilye var ve bunlari x tane kutuya atmak istiyorsun sorusu ile ayni
Ancak biz sonucta bos kutu kalmasini istemedigimiz icin once, her kutuya 1 bilye atarak basliyoruz sonra
elimizde kalan N-X tane bilyeyi kutulara rasgele atarak elimizdeki bilyeleri bitiriyoruz. Sonucta kutulardaki bilyeler de bizim rasgele dagilim oluyor.
matlab da algoritmasi soyle olabilir
clear all
clc
N=1000
X=30
u=ones(X,1);
for(i=1:(N-X));
k=ceil((X)*rand(1));
u(k,1)=u(k,1)+1;
end
u'
bu da programin ciktisi
ans =
Columns 1 through 13
28 32 31 28 28 36 34 30 30 33 25 37 42
Columns 14 through 26
46 20 36 37 46 33 26 34 32 37 26 41 37
Columns 27 through 30
31 31 40 33
gordugun gibi dagilim cok daha homojen.
hadi kolay gelsin sorun olursa yaziver.
oncelikle crown un ve tepedeki psychedelic adamin urettigi algoritmalarda bir sorun var zannederim.
Bu algoritmalarda ilk uretilen sayilar sonraki uretilen sailardan daha buyuk olma egiliminde,
bu algoritmayi yazdim ve N=1000 X=30 icin uyguladim
(not: burada X i parca sayisi olarak aliyorum yani sana toplami 1000 eden 30 sayi uretecek bu algoritma. Bu 30 sayida sira ile sutunlarin genisligi olacak, Not bu algoritmayi sadece durumu gostermek icin yazdigimdan 0 genisligindeki sutunlari eleyecek bir seyler eklemedim algoritmaya)
bu algoritma (matlab da yazilmis)
clear all
clc
N=1000
X=30
u=[];
for(i=1:(X-1));
u(i,1)=round(N*rand(1));
N=N-u(i,1);
end
u=[u;N];
u'
bu da programin ciktisi
Columns 1 through 13
669 63 99 78 89 0 2 0 0 0 0 0 0
Columns 14 through 26
0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 27 through 30
0 0 0 0
sayilarin giderek kuculdugunu gorebilirsin.
altarnatif ise soruyu biraz farkli ele almak
bu soru elinde N atne bilye var ve bunlari x tane kutuya atmak istiyorsun sorusu ile ayni
Ancak biz sonucta bos kutu kalmasini istemedigimiz icin once, her kutuya 1 bilye atarak basliyoruz sonra
elimizde kalan N-X tane bilyeyi kutulara rasgele atarak elimizdeki bilyeleri bitiriyoruz. Sonucta kutulardaki bilyeler de bizim rasgele dagilim oluyor.
matlab da algoritmasi soyle olabilir
clear all
clc
N=1000
X=30
u=ones(X,1);
for(i=1:(N-X));
k=ceil((X)*rand(1));
u(k,1)=u(k,1)+1;
end
u'
bu da programin ciktisi
ans =
Columns 1 through 13
28 32 31 28 28 36 34 30 30 33 25 37 42
Columns 14 through 26
46 20 36 37 46 33 26 34 32 37 26 41 37
Columns 27 through 30
31 31 40 33
gordugun gibi dagilim cok daha homojen.
hadi kolay gelsin sorun olursa yaziver.
- selfadjoint (18.11.09 09:22:45)
1