Prosta maszyna losująca liczby z zakresu bez powtórzeń

Odpowiedz Nowy wątek
2017-09-19 22:39
0

Hej
Potrzebuję zbudować prosty skrypt, który pozwoli mi losowo przyporządkować zawodnikom pozycje startowe z zakresu <1;6>. Być może można zrobić to szybciej w innym języku, lub w excelu, ale ja myślę, ze w SQL też powinno się udać.

Zasada działania:

  1. Mamy listę 6 zawodników (P1, ... , P6)
  2. Mamy listę 6 pozycji startowych (1, ... , 6)
  3. Chcemy każdemu zawodnikowi przypisać jeden losowy numer
    a) Losowanie bez powtórzeń - Każdy kolejny losuje z puli pozostałych pozycji
    b) Ostatni wiadomo - dostaje to co zostało
  4. Tworzymy zapytanie losujące - może być update wartości w tabeli, a może być tylko wyświetlenie
  5. Każde uruchomienie zapytania powinno zwracać inne przyporządkowanie

Ok, zaczynamy.
Przygotowujemy sobie dane:

CREATE TABLE ZAWODNICY (
    IMIE nvarchar(255),
    POZ INT )

----------------------------

INSERT INTO ZAWODNICY (IMIE)
VALUES (N'P1'),('P2'),('P3'),(N'P4'),('P5'),('P6') 

----------------------------

CREATE TABLE POZYCJE (
    NR INT )

----------------------------

INSERT INTO POZYCJE (NR)
VALUES (1),(2),(3),(4),(5),(6) 

Tabela POZYCJE powstała na wszelki wypadek. być może się przyda.
Następny krok - tworzymy zapytanie dynamiczne:

DECLARE
    @imie nvarchar(255),
    @poz int

DECLARE los CURSOR FOR
    SELECT imie, poz from ZAWODNICY

OPEN los;
FETCH NEXT FROM los INTO @imie, @poz;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    PRINT @imie 
    PRINT @poz;

FETCH NEXT FROM los INTO @imie, @poz;

END

CLOSE los
DEALLOCATE los

I na tym moje pomysły się kończą...
obecnie próbuje coś wykombinować z funkcją RAND(), ale ona losuje z zakresu <0;1>
Być może ktoś z Was tworzył coś podobnego?
Szukam cały wieczór i nie mogę znaleźć podobnego automatu :(

Pozostało 580 znaków

2017-09-19 22:43
0
RAND()*10 // liczba z zakresu <0; 10>
(RAND()*10) % 6 // liczba z zakresu <0; 5>
((RAND()*10) % 6) + 1 // liczba z zakresu <1; 6>

Pozostało 580 znaków

2017-09-19 22:52
0
ekhart napisał(a):
RAND()*10 // liczba z zakresu <0; 10>
(RAND()*10) % 6 // liczba z zakresu <0; 5>
((RAND()*10) % 6) + 1 // liczba z zakresu <1; 6>

dzięki, losowanie działa, ale Twoje rozwiązanie, nie zapewnia unikalnego rezultatu.
Dwóch zawodników nie może startowac z tej samej pozycji :(

Pozostało 580 znaków

2017-09-19 23:09
2

Nic nie losuj, po prostu ustal kolejność/pozycje:

select 
    imie
    , row_number() over(order by newid()) pozycja
from 
    zawodnicy
order by 1

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0