Witam, zwracam sie z prosba o rade jak moge utworzyc 700 sekwencji zlozonych z 4 cyfr (0-9) w taki sposob by kazda z cyfr wystepowala na kazdej z 4 pozycji z takim samym prawopodobienstwem jednakze by te same cyfry nie wystepowaly obok siebie. Potrzebuje tych sekwencji do eksperymentu i do tej pory uzywalam programu MatLab w podobnych zadaniach, jednak nie potrafie obejsc warunku aby cyfry nie wystepowaly obok siebie. Bede wdzieczna za wskazowki.
Wylosuj jedną cyfrę z 10, a następnie na każdej pozycji kolejnej jedną z 9. Albo w drugą stronę, losujesz liczbę całkowitą z zakresu <0,10*9^(n-1)) i pobierasz kolejne cyfry, pierwszą używając reszty z dzielenia przez 10, kolejne reszty z dzielenia przez 9. Jeżeli jedna z tych "kolejnych" cyfr jest większa równa niż poprzednia to dodajesz do niej 1.
W przełożeniu na algorytm:
- w pętli od i=1 do 4
- losuj cyfrę z zakresu [0 .. 10-i]
- dopóki cyfra występuje w zbiorze cyfr wylosowanych
- zwiększ cyfrę o 1
- dodaj cyfrę do zbioru cyfr wylosowanych
adf88 napisał(a)
W przełożeniu na algorytm:
- w pętli od i=1 do 4
- losuj cyfrę z zakresu [0 .. 10-i]
- dopóki cyfra występuje w zbiorze cyfr wylosowanych
- zwiększ cyfrę o 1
- dodaj cyfrę do zbioru cyfr wylosowanych
ok, tylko czy w takim razie mam pewnosc ze kazda z cyfr 0-10 wystapi z takim samym prawdopodobienstwem na kazdej pozycji w zakresie 700 sekwencji? chodzi o to zeby w tych 700 sekwencjach 4 cyfrowych kazda z cyfr wystapila z takim samym prawdopodobienstwem jak 9 pozostalych na danej pozycji na przestrzeni 700 sekwencji, nie w zakresie pojedynczej sekwencji. sorry, jestem laik w tej dziedzinie, nie wiem czy to dobrze wyjasniam...
Losujesz pierwszą cyfrę ze zbioru A = {0,1,2,3,4,5,6,7,8,9}, każdą kolejną ze zbioru A - {poprzednio_wylosowana}. Każda cyfra występuje na każdym miejscu z takim samym prawdopodobieństwem.
Ah, mój błąd. Poprzedni algorytm dotyczył losowania całkowicie bez powtórzeń. Tak będzie poprawnie:
- losuj cyfrę z zakresu [0 .. 9]
- zapisz cyfrę jako kolejna cyfra wyniku
- w pętli od i=1 do 3
- losuj cyfrę z zakresu [0 .. 8]
- jeśli cyfra jest identyczna z poprzednią to zwiększ cyfrę o 1
- zapisz cyfrę jako kolejna cyfra wyniku
W ten sposób każda z cyfr będzie tak samo prawdopodobna na każdym miejscu. I tak 700 razy.
Aha, jeszcze jedno. Wiedz, że komputer nie generuje prawdziwie losowych liczb. W niektórych przypadkach może to negatywnie wpłynąć na wynik eksperymentu. Jeśli chcesz prawdziwie losowe liczby to pobierz je z jakiejś strony internetowej która takowe oferuje.
- losuj cyfrę z zakresu [0 .. 9]
- zapisz cyfrę jako kolejna cyfra wyniku
- w pętli od i=1 do 3
- losuj cyfrę z zakresu [0 .. 8]
- jeśli cyfra jest identyczna z poprzednią to zwiększ cyfrę o 1
- zapisz cyfrę jako kolejna cyfra wynikuW ten sposób każda z cyfr będzie tak samo prawdopodobna na każdym miejscu. I tak 700 razy.
Nope:
- 0 będzie miało trochę mniejszą szansę na wylosowanie (około 7/64)
- 9 będzie miało dużo mniejszą szansę na wylosowanie (bardzo małą, około 1/64).
Trzeba zmienić 2 kroki:
- losuj cyfrę z zakresu [0 .. 9]
- zapisz cyfrę jako kolejna cyfra wyniku
- w pętli od i=1 do 3
- losuj cyfrę z zakresu [0 .. 9]
- jeśli cyfra jest identyczna z poprzednią to zwiększ cyfrę o 1
- jeśli cyfra > 9 to cyfra := 0
- zapisz cyfrę jako kolejna cyfra wyniku
A nie prościej od razu losować z dopuszczalnego zakresu?
import random
result=[]
for i in range(700):
n = random.choice(range(10))
lista=[n]
for i in range(3):
l = range(10)
l.remove(n)
n = random.choice(l)
lista.append(n)
result.append(lista)
bogdans napisał(a)
A nie prościej od razu losować z dopuszczalnego zakresu?
import random
result=[]
for i in range(700):
n = random.choice(range(10))
lista=[n]
for i in range(3):
l = range(10)
l.remove(n)
n = random.choice(l)
lista.append(n)
result.append(lista)
Hi. Kazda z cyfr w 4 cyfrowym ciagu musi byc rozna. W takim razie ciag 2373 jest niedopuszczalny. Problem polega na tym, ze te sekwencje beda potem przetransportowane ne rozne dzwieki w programie MatLab, kazdy dzwiek muzi byc rozny w pojedynczej sekwencji ale wystapic z takim samym prawdopodobienstwem we wszystkich 700 sekwencjach na kazdej 1, 2,3 i 4 pozycji.
Kazda z cyfr w 4 cyfrowym ciagu musi byc rozna
Nie mogłeś tego od razu napisać, albo przerobić zamieszczony kod?
import random
result = []
for i in range(700):
l = range(10)
n = random.choice(l)
lista = [n]
for i in range(3):
l.remove(n)
n = random.choice(l)
lista.append(n)
result.append(lista)
bogdans napisał(a)
Kazda z cyfr w 4 cyfrowym ciagu musi byc rozna
Nie mogłeś tego od razu napisać, albo przerobić zamieszczony kod?
import random
result = []
for i in range(700):
l = range(10)
n = random.choice(l)
lista = [n]
for i in range(3):
l.remove(n)
n = random.choice(l)
lista.append(n)
result.append(lista)
Dzieki!
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.