Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dva random broja čija kombinacija ne postoji u tabeli

[es] :: MS SQL :: Dva random broja čija kombinacija ne postoji u tabeli

Strane: 1 2

[ Pregleda: 5475 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.240.*



+104 Profil

icon Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 12:47 - pre 193 meseci
U jednoj tabeli postoje kolone:

ID....
LocationX INT
LocationY INT
...

Treba da nađem jednu kombinaciju LocationX i LocationY koja ne postoji u bazi. LocationX i LocationY su ograničene vrednosti (npr 0 - 100) i bilo bi poželjno da nova kombinacija bude blizu starih :)

primera radi ako u bazi postoje
LocationX LocationY
----------------------
10 10
8 12
12 1


bilo bi poželjno da nova kombinacija bude npr 8-10 pre nego 100 - 100. Znao bih kako to da napravim sa jednom petljom koja će proveravati da li zadata kombinacija postoji u bazi, pa ako je postoji da zada novu i ponovi postupak, ali me interesuje da li postoji bolje rešenje

Pozdrav
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
82.117.202.*

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 13:22 - pre 193 meseci
Code:

declare @x int
declare @y int

while 1=1
begin
    select @x = rand()*100+1
    select @y = rand()*100+1
    if not exists(select * from loc where x=@x and y=@y)
    begin
        insert into loc values(@x, @y)
        return
    end
end


Naravno, ovo je brzo resenje nije bas optimalno (rand je poprilicno losa funkcija - ali ovde radi posao posto ponavljanja nisu moguca).
Takodje ako hoces bliske vrednosti, mozes za osnovu rand-a da uzmes max vrednost iz trenutne tabele i dodas jos neki mali broj (time bi izbegao beskonacnu petlju kada ispucas sve kombinacije ali bi polako pomerao limit mogucih vrednosti)...

[Ovu poruku je menjao Fedya dana 27.05.2008. u 14:36 GMT+1]
Every hamster has his day.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 14:42 - pre 193 meseci
Citat:

Znao bih kako to da napravim sa jednom petljom koja će proveravati da li zadata kombinacija postoji u bazi, pa ako je postoji da zada novu i ponovi postupak, ali me interesuje da li postoji bolje rešenje

A sto ne probas da postavis Index-e na ta 2 polja i das im UNIQUE CONSTRAINT ..
Kad neko bude ubacivao nove vrednosti SQL baca exception na osnovu tog Unique index-a
ako kombinacija vec postoji .....
Code:

CREATE TABLE Tabela ( 
   [ID] int .... 
   [LOCATIONX] int ... 
   [LOCATIONY] int .... 

   CONSTRAINT [IX_LOCATION] UNIQUE NONCLUSTERED 
   (
      [LOCATIONX],
      [LOCATIONY] 

   ) ON [PRIMARY] 

)


i dodas posle tvoj check constrain za doticna polja da mogu biti u rasponu od (0 -100)
Code:

ALTER TABLE Tabela 
ADD CONSTRAINT checkLocationX CHECK (Tabela.LOCATIONX  >= 0 AND Tabela.LOCATIONX < 100  );
ADD CONSTRAINT checkLocationY CHECK (Tabela.LOCATIONY  >= 0 AND Tabela.LOCATIONY < 100  );




Viva lollapalooza
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 15:02 - pre 193 meseci
Napravi temp tabelu sa vrednostima 1-100 i uradi join na samu sebe, kako bi dobio sve moguće parove (x, y) (doduše, možeš i da pripremiš takvu tabelu, 10000 nije mnogo slogova). Onda uradiš SELECT TOP 1 sa WHERE uslovom da se par ne nalazi u tvojoj tabeli. Dodatnim dobro smišljenim ORDER BY možeš da ispuniš i svoj, loše definisan uslov da vrednosti budu "bliže" postojećim.

Code:

select top 1 p1.x, p2.x from temp_tab p1
inner join temp_tab p2 on 1=1
left outer join tabela t on (p1.x = t.x and p2.x = t.y)
where t.x is null;


edit: dodao kod

[Ovu poruku je menjao jablan dana 27.05.2008. u 16:28 GMT+1]
 
Odgovor na temu

Fedya
Fedor Hajdu
Solution Architect
Emaratech
Dubai, UAE

Član broj: 28246
Poruke: 790
82.117.202.*

Jabber: fedya@elitesecurity.org
Sajt: devtechgroup.com


+34 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 15:02 - pre 193 meseci
@deerbeer: he he, nisam skontao poslednju liniju :P

Nego, ovo sto si naveo i dalje nije resenje posto je pitanje kako dobiti random kombinaciju.
Trenutno sam malo zauzet, razmislicu o ovome malo kasnije (ako neko ne uskoci sa resenjem).
Every hamster has his day.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 15:12 - pre 193 meseci
Citat:
@Fedya
@deerbeer: he he, nisam skontao poslednju liniju :P

Na koju mislis ??

Citat:
@Fedya
Nego, ovo sto si naveo i dalje nije resenje posto je pitanje kako dobiti random kombinaciju.

U pravu si ....e sad ne znam sta je postavka zadatka tj. nisam bas shvatio iz vujketovog posta
generisanje random brojeva programski ili "korisnicki" ?
Ako korisnici unose te brojeve (sto se isto moze smatrati random unosom) onda je check constraint sasvim logicno resenje ....

Citat:
vujkev
....bilo bi poželjno da nova kombinacija bude npr 8-10 pre nego 100 - 100.

Sa ovim mojim primerom nikako ne moze :)


[Ovu poruku je menjao deerbeer dana 27.05.2008. u 16:30 GMT+1]
Viva lollapalooza
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.240.*



+104 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 15:45 - pre 193 meseci
Citat:
deerbeer
A sto ne probas da postavis Index-e na ta 2 polja i das im UNIQUE CONSTRAINT ..

Kreiranje novog para je programski bez intervencije korisnika

Citat:
jablan
... Dodatnim dobro smišljenim ORDER BY možeš da ispuniš i svoj, loše definisan uslov da vrednosti budu "bliže" postojećim.


Ne razumem "loše definisan uslov". Nisi razumeo koji je problem ili misliš da ovo može bolje da se napravi u bazi?

Ovako sam ja za sad napravio, a ako neko zna bolje nek se javi. U svakom slučaju postupak je da prvo nađemo min i max lokacije iz baze, povećamo taj okvir za npr 4 i iz tog okvira nađemo novi par koji ne postoji u bazi

Code:

declare @MinX int
declare @MinY int
declare @MaxX int
declare @MaxY int
declare @x int
declare @y int
declare @Delta int

set @Delta = 4

while 1=1
begin

    select @MinX=min(LocationX), @MinY=Min(locationY), @MaxX=max(LocationX), @MaxY=Max(LocationY)
        from tblVillages
    
    if @MinX >= @Delta
        set @MinX = @MinX - @Delta
    else
        set @MinX = 0

    if @MaxX <= 100 - @Delta
        set @MaxX = @MaxX + @Delta
    else
        set @MaxX = 100

    if @MinY >= @Delta
        select  @MinY = @MinY - @Delta
    else
        set @MinY = 0

    if @MaxY <= 100 - @Delta
        select  @MaxY = @MaxY + @Delta
    else
        set @MaxY = 100

    select @x = ROUND(((@MaxX - @MinX -1) * RAND() + @MinX), 0)
    select @y = ROUND(((@MaxY - @MinY -1) * RAND() + @MinY), 0)


    if not exists(select * from tblVillages where LocationX=@x and LocationY=@y)
    begin
        select @x, @y
        --insert into loc values(@x, @y)
        return
    end
end

Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 15:51 - pre 193 meseci
Citat:
vujkev: Ne razumem "loše definisan uslov". Nisi razumeo koji je problem ili misliš da ovo može bolje da se napravi u bazi?

Napisao si:
Citat:
vujkev: bilo bi poželjno da nova kombinacija bude blizu starih

A nisi napisao šta znači "blizu starih". Kompjuteri nažalost još uvek ne mogu da čitaju misli, a bogami ni mi na forumu.

Dakle, "blizu starih" između ostalog može da znači:
1) Novi x i y uzimaju vrednosti koje se najčešće pojavljuju među starim (postojećim) vrednostima.
2) x i y uzimaju vrednosti najbliže prosečnoj vrednosti starih vrednosti x i y
3) x i y uzimaju vrednosti najbliže prosečnim vrednostima starih vrednosti x i y (posebno x, posebno y)

itd itd.

BTW, u slučaju da ti treba taj dodatni uslov "blizine", ne može se više govoriti o random vrednostima. I inače, mislim da je random loše izabran pojam i da problem uopšte ne treba rešavati upotrebom random funkcija. Čini mi se da se previše trudite da prenesete logiku iz struktuiranog programiranja u SQL. To što stored procedure to omogućavaju ne znači da je to dobar put.

[Ovu poruku je menjao jablan dana 27.05.2008. u 17:06 GMT+1]
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 16:00 - pre 193 meseci
Hmmm.. zanimljiv kod ... voleo bih da znam cemu sluzi
tj. svrha generisanja brojeva sa RAND() funkcijom u tvom primeru
(Slucajno rasporedjivanje lokacije sela unutar neke opstine ? :)

Da li ti ovaj kod daje raspodelu brojeva kao sto si hteo
(od 0 do 100 ali sa gustom raspodelom do 10) ?

Probacu kasnije da li moze da se uprosti ovakav primer ...


Viva lollapalooza
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.240.*



+104 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 17:01 - pre 193 meseci
Citat:
jablan: A nisi napisao šta znači "blizu starih". Kompjuteri nažalost još uvek ne mogu da čitaju misli, a bogami ni mi na forumu.

Ok moj previd. Već dosta radim na ovom programu tako da sam predpostavio da je i vama jasno da LocationX i LocationY predstavljaju koordinate u xy ravni. Kad kažem blizu mislim da rastojanje između nove tačke i starih tačaka bude "manje". Ne znam kako bolje da objasnim



Citat:
deerbeer
Da li ti ovaj kod daje raspodelu brojeva kao sto si hteo
(od 0 do 100 ali sa gustom raspodelom do 10) ?

pa ne baš :( Ovaj kod mi daje tačke koje su za max. @Delta udaljene od krajnjih tačaka koje postoje u tabeli.
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 17:13 - pre 193 meseci
Citat:
vujkev: Kad kažem blizu mislim da rastojanje između nove tačke i starih tačaka bude "manje". Ne znam kako bolje da objasnim

Možda ovako: "Suma razdaljina nove tačke od postojećih tačaka treba da bude minimalna.".

I da, ovaj uslov definitivno isključuje svaku upotrebu slučajnih brojeva, pošto se tačno zna koje ga kordinate zadovoljavaju.

Evo ti rešenje u PostgreSQL-u, ti ga prevedi u MSSQL ako hoćeš:
Code:

reports=# select * from sve_koord ;
 x 
---
 1
 2
 3
 4
 5
(5 rows)

reports=# select * from tabela ;
 x | y 
---+---
 2 | 5
 3 | 1
 4 | 4
(3 rows)

reports=# select p1.x as nx, p2.x as ny, sum((p1.x - r.x)^2 + (p2.x-r.y)^2) as d
from sve_koord p1
inner join sve_koord p2 on 1=1
left outer join tabela t on (p1.x = t.x and p2.x = t.y)
inner join tabela r on 1=1
where t.x is null
group by nx, ny
order by d;
 nx | ny | d  
----+----+----
  3 |  3 | 11
  3 |  4 | 12
  2 |  3 | 14
  4 |  3 | 14
  2 |  4 | 15
  3 |  2 | 16
  2 |  2 | 19
  4 |  2 | 19
  3 |  5 | 19
  4 |  5 | 22
  5 |  3 | 23
  1 |  3 | 23
  5 |  4 | 24
  1 |  4 | 24
  1 |  2 | 28
  5 |  2 | 28
  4 |  1 | 30
  2 |  1 | 30
  5 |  5 | 31
  1 |  5 | 31
  5 |  1 | 39
  1 |  1 | 39
(22 rows)

Tačka koju tražiš je TOP 1 u poslednjem queryju, ostavio sam ga celog da bi se videla treća kolona, odnosno suma kvadrata rastojanja između nove tačke i svih postojećih.


[Ovu poruku je menjao jablan dana 27.05.2008. u 18:25 GMT+1]
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.240.*



+104 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 18:37 - pre 193 meseci
Pa ne treba mi baš to. Po ovom kodu, ako sam dobro razumeo, ukoliko imam tačku 0,0 i 4,4, nova tačka će biti 2,2. Meni ipak treba random tačka koji će biti blizu dve postojeće tačke.


Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 18:45 - pre 193 meseci
Odustajem.

BTW, čemu ti služe te tačke koje su kao random a nisu random i koje su blizu, a nisu baš blizu?
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.eunet.yu.



+171 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 20:35 - pre 193 meseci
Citat:
jablan: Odustajem.

BTW, čemu ti služe te tačke koje su kao random a nisu random i koje su blizu, a nisu baš blizu?


Dobar si


Vujke stvarno, Jablan ti je dobro rekao ili tacke treba da zadovoljavaju odredjeni uslov ili da su radnom, ili recimo zeilis odredjeni opseg (koji je blizi "proslim" tackama) pa u tom opsegu da izaberes random, mada sve ovo mu onda dodje random
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli27.05.2008. u 20:55 - pre 193 meseci
Evo jedne ideje: Uzmeš ovu listu koju ti generiše moj upit i iz nje izabereš jedan par tačaka, ali po Poasonovoj raspodeli (tj. favorizuješ tačke koje su pri vrhu liste, odnosno bliže postojećim tačkama).

Mada stvarno bi pomoglo kad bi objasnio šta ustvari hoćeš da postigneš, tj. koji realni problem rešavaš. Da nije potapanje brodova? :D
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli28.05.2008. u 16:18 - pre 193 meseci
Ako su ti tacke na u ravni X,Y gde X i Y idu od 1 do 100, samo celi brojevi, onda imas 100 X 100 tacaka. Neke od njih su "u bazi".

Mozes da probas ovo: Ako napravis tabelu sa SVIM MOGUCIM parovima koordinata, dakle 100 X 100 = 10,000 tacaka i dodas jos jednu kolonu "Zauzeta", koja je 1 ako je tacka zauzeta ("tacka je u bazi") ili 0 ako je tacka slobodna, onda celu pricu mozes da nacrtas u koordinatnom sistemu.

Ako izaberes bilo koju zauzetu tacku, sa koordinatama (X,Y), ona ce biti u centru nekog kvadrata. Njeni najblizi susedi su tacke na sredinama stranica kvadrata i imace koordinate:

sused levo (x-1, y)
sused desno (x+1, y)
sused gore (x, y+1)
sused dole (x, y-1)

Bilo koja od ovih tacaka je podjednako daleko od izabrane tacke (opet RANDOM

Malo dalje od prethodnih su tacke na temenima kvadrata:

severozapadni sused (x-1,y+1)
severoistocni sused (x+1,y+1)
jugoistocni sused (x+1,y-1)
jugozapadni sused (x-1,y-1)


Ako izaberes bilo koju tacku (evo ga Random) koja je Zauzeta, onda vidis koordinate njenih suseda, i tu trazis prvu slobodnu tacku. Blizih od ovoga nema. Ako ni jedan sused nije slobodna tacka, ides na sledeci kvadrat. Ovaj algoritam ti garantuje da ces izabrati tacku koja je najbliza moguca posmatranoj tacki. Moze psotojati vise od jedne tacke koje su na istoj udaljenosti od posmatrane tacke.

Mislim da sam video knjige u kojim se slicni problemi resavaju cistim SELECT naredbama, bez petlji. Ako nadjem, pokazacu takvo resenje.
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
*.telekom.yu.



+104 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli29.05.2008. u 17:18 - pre 193 meseci
Citat:
jablan: Odustajem.

BTW, čemu ti služe te tačke koje su kao random a nisu random i koje su blizu, a nisu baš blizu?


Sorry, ne znam kako sam zaboravio da odgovorim prošli put kad si pitao.

Učetvujem u izradi igrice slične TribalWars (nadam se da sam dobro napisao) u kom korisnik može da kreira "Selo" na mapi. Zahtev je da na početku igrice (dok je broj korisnika mali) rastojanje između sela bude "malo", tj. da sela budu koncentrisana na mapi. Raspored sela ne bi trebalo da bude uniforman nego "random" tako da mi x-1 i y+1 ne odgovara.

Za sad kod koji sam postavio mi radi najbolje, tj. nova sela jesu "random" u nekom okviru.


Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli29.05.2008. u 17:23 - pre 193 meseci
Bože blagi, stvarno kodiraš igricu u TSQL-u?!
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.240.*



+104 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli29.05.2008. u 20:49 - pre 193 meseci
Ne kodiram igricu već tražim samo jedan podatak.

Kako bi ti to uradio?

Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Dva random broja čija kombinacija ne postoji u tabeli29.05.2008. u 20:52 - pre 193 meseci
Pa za tako male količine podataka, bazu možeš da koristiš eventualno kao mesto gde snimaš podatke između dva pokretanja programa (i to obično neku embedded), a obično se za to koriste obični tekstualni fajlovi (XML npr). Raspoređivanje sela kao i ostalu logiku radiš u aplikaciji, korišćenjem nekog suvislijeg jezika.

Edit: Tek sam sad pogledao šta je TribalWars (onlajn igrica). Onda i nije mala količina podataka u pitanju, pa možda i ima logike prebaciti to u bazu. Koliko su velike mape?

E da, predlog za algoritam za raspoređivanje novog sela: Zadaš na početku minimalno rastojanje A i maksimalno rastojanje B. Onda nađeš sve nezauzete tačke koje se ne nalaze bliže od B od bilo koje postojeće tačke, niti dalje od B od bilo koje postojeće tačke. Od tih tačaka izabereš jednu random i to ti je to.

[Ovu poruku je menjao jablan dana 29.05.2008. u 22:05 GMT+1]
 
Odgovor na temu

[es] :: MS SQL :: Dva random broja čija kombinacija ne postoji u tabeli

Strane: 1 2

[ Pregleda: 5475 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.