PDA

Tam Sürümünü Görmek İçin : rand() fonksiyonunda aynı değeri bir daha atamama


choldax
03/01/2008, 08:28
================================================== ================
#include <stdio.h>
#include <time.h>

int main()
{
int x,y;
srand(time(NULL));
x=rand()%50;
y=rand()%10;

printf("(%d,%d)\n", x,y);

return 0;
}
================================================== ================


bu kodu çalıştırdığımda, örneğin (35,4) ikilisinin karşıma bir kez çıkmasını, değerler tükenince de programdan çıkmayı istiyorum. bunun bir fonksiyonu var mıdır acaba?
veya çıkan her değeri bir array'in içine atıp yeni gelen her değer için o array'le karşılaştırma mı yapmalıyım?
ne yapmalı
ne etmeli

yardımlarınızı bekliyorum. Sevgiler, saygılar.


-aga-
03/01/2008, 09:27
Array tanımlamalısın.:)
#include <stdio.h>
#include <time.h>

int main()
{
int x,y;
bool el[50,10];
srand(time(NULL));
x=rand()%50;
y=rand()%10;
for (int a=0;a<500;a++)
{
while (el[x][y]>0])
{
x=rand()%50;
y=rand()%10;
}
el[x][y]=1;
printf("(%d,%d)\n", x,y);
}
return 0;
}

choldax
03/01/2008, 10:32
çok teşekkür ederim :) anladığım kadarıyla boş bir arrayde sayılar atandıkça atandığı koordinatlar 1 oluyor.

choldax
03/01/2008, 11:24
bunu neden istedim peki?
olay şu:

( kız arkadaşımın bana dönmesi için :D )

quasimodo
03/01/2008, 17:25
bool el[50,10];
Bu sekilde matris tanimlanabiliyor mu? Ilk defa goruyorumda.

choldax
03/01/2008, 19:14
o bool boolean'ın bool'u sanırım. kullanım şekli o olsa gerek

acehreli
03/01/2008, 20:49
-aga-'nin o kodu derledigini sanmiyorum. :) Derlense bile surada bir tanimsiz davranis var:

while (el[x][y]>0)

Orada ilk degeri verilmemis bir nesneye erisilmeye calisiliyor.

choldax, rand() islevi cekirdek degere bagli olarak hep ayni sayi dizisini uretir. Eger belirli bir degerin ilk olarak cikmasini istiyorsan, srand'i time'in dOndurdugu degerle degil; kendi sectigin bir degerle cagir. Eger rand istedigin sayiyi verdiyse iyi... Yoksa srand icin baska bir deger kullan. Boylece istedigin ilk sayiyi (ve eger sansliysan ikinci sayiyi) belirleyebilirsin.

Ali

choldax
03/01/2008, 23:54
-aga-'nın algoritması işime yaradı şöyle ki,
int a[3][3] = {0} //3x3'lük bir array açıp içindeki tüm sayıları 0'a eşitliyorum
int x,y;

x=rand()%3;
y=rand()%3;


while(a[x][y]>0)
{...}
ile şu anlatılıyor; bu array şu şekilde
0 0 0
0 0 0
0 0 0

diyelim rastgele 1,2 geldi. şu şekle bürünecek

0 0 0
0 0 1
0 0 0

böylece bir daha 1,2 gelirse array'in o değeri 1 olduğundan yeni sayılar arayacak.

En azından anladığım bu :)
Saygılar

-aga-
04/01/2008, 08:45
arkadaşlar aklım hep basic'e gidiyor.O yüzden değer vermemişim. Ama mantık zaten basit. Choldax ta bunu anlamış ve doğru şekilde düzeltmiş.:)
Bool şeklinde array tanımlanabilir mi bilmiyorum,ama bool ün diğer veri tiplerinden ne farkı var ki?

tujix
04/01/2008, 14:06
choldax (http://forum.ceviz.net/member.php?u=89076) seni paylasimci olmaya davet ediyorum kaynak koddan bahsediyorum;)

myavuzselim
04/01/2008, 16:53
-aga-'nin algoritmasi elemanlar arttikca son derece yavas calisacaktir. 1 milyon elemanli bir dizinin bu sekilde son elemanini rastgele bulmaya calistiginizi dusunun.

Bunun yerine once diziyi karistirip sonra sirayla elemanlara ulasmak daha dogru bir yontem. Dizi sabit kalmali ise bir index dizisi olusturup onu karabilirsiniz.

Ornek:
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <stdio.h>

/* http://www.codinghorror.com/blog/archives/001008.html */
void karistir(int* arr, int size) {
int i;
for (i = size-1; i > 0; i--) {
int n = rand() % (i + 1); /* cok iyi bir yontem olmasa da */
int temp = arr[i];
arr[i] = arr[n];
arr[n] = temp;
}
}

int *newAralik(int bas, int son) {
int *arr;
int i;
int size;

assert(bas >= 0 && son >= bas);

size = son - bas;
arr = (int*) malloc(size * sizeof(int));

for (i=0; i<size; i++)
arr[i] = bas + i;

return arr;
}

int main() {
int x_size = 50, y_size = 10;
int *indices = newAralik(0, x_size * y_size);
int i;

karistir(indices, x_size * y_size);
for (i=0; i < x_size*y_size; i++) {
int x = indices[i] % x_size;
int y = indices[i] / x_size;
printf("(%d, %d)\n", x, y);
}
free(indices);
}

choldax
04/01/2008, 19:07
kodu göndermem ama buraya algoritmayı yazarım :)

2 boyutlu char array'i aç. Bütün array'e 'a' ata. Harflerin koordinatlarını belirle, oralara da ' ' ata. Daha sonra tüm array'i random şekilde gez. Eğer gezdiğin koordinat 'a' ise oraya char değeri 3 olan karakter ata. Daha sonra yukardaki kodu uygula
:)

benim yapacağım yeni kod, harflerin fonksiyonunu yazmak. Mesela A() yazınca direk A harfi çıkacak. Böylece çok uzun olmayan isimler bu şekilde yazılabilecek. Onun programını buraya koyabilirim işte :)

saygılar efendim

tujix
05/01/2008, 17:30
tskler buda yeterli;)