yorgwarez
26.08.2011, 23:45:52
Witam wszystkich forumowiczów,
Jestem początkującym programistą php i stawiam dopiero pierwsze kroki. Obecnie zajmuję się generatorem liczb losowych bez powtarzania.
Mam stworzone oto coś takiego:
<?php
// Tworzymy tablice ze zdefiniowanymi liczbami do wylosowania
// Losowanie
$tmp['random'] = array_rand($cfg['list'], 2
); // Drugi parametr odpowiada za ilość elementów, które mają zostać wylosowane // Sortowanie
// Throw
?>
Zastanawiam się teraz i już 3 dzień nie mogę znaleźć rozwiązania, co zrobić, aby skrypt mógł np. wypisać pary liczb ze wszystkich elementów tej tablicy jaka jest tworzona i wyrzucił je na ekranie w sposób, że w każdej linijce znajduje się para liczb: LICZBA 1 - LICZBA 2 i w następnych linijkach poniżej kolejne pary liczb, oczywiście bez powtarzania i tak by powstały pary ze wszystkich elementów tworzonej tablicy. Czy trzeba jakąś pętlę wrzucić do skryptu? Ktoś mógłby mi pomóc i pokazać na przykładzie? Z góry dziękuję za pomoc:) Pozdrawiam Wszystkich Forumowiczów
sada
27.08.2011, 08:11:29
zależy co rozumiesz przez powtarzanie:
np.
- czy tepary są dla ciebie identyczne $[1],$[2] i $[2],$[1] ?
- czy ma nie być powtórzeń w wylosowanych parach $[1],$[1] $[5],$[5] ?
peter13135
27.08.2011, 09:32:35
Nie wiem, czy wiem o co Ci chodzi.... więc wybacz, jeśli dam Ci bezużyteczny kod.
$tablica = array(1
,2
,3
,4
,5
,6
,7
,8
,9
,10
); for($i=0;$i<=10;$i+=2)//zamiast tej "sztywnej" dyszki, możesz tutaj dać zmienną wyplutą przez count($tablica)
{
echo $tablica[$i] . ' ' . $tablica[$i+1] . '<br />' ; }
sada
27.08.2011, 09:40:09
@peter13135
$i<9 bo zabraknie towaru

bo ostatni element tablicy ma index 9
yorgwarez
27.08.2011, 09:48:16
Dziękuje wszystkim za pomoc:)
Peter13135 o coś takiego mi chodziło, tylko z małą modyfikacją. Wypisuje pary liczb z zakresu tablicy ale jak zrobić by te liczby ustawiane w pary były pomieszane a nie zawsze po kolei? Chodzi mi np. o wylosowanie par z zakresu tablicy typu 3-1, 8-2 itp. Oczywiście bez powtarzania się liczb tak jak teraz.
sada
27.08.2011, 09:51:51
$tablica = array(1
,2
,3
,4
,5
,6
,7
,8
,9
,10
);
for($i=0;$i<10;$i++){
for($k=$i+1;$k<10;$k++){
echo $tablica[$i] . '-' . $tablica[$k] . '<br />' ; }
}
żeby pomieszać dodaj shuffle($tablica) i umieść po definicji tablicy
peter13135
27.08.2011, 09:53:16
Cytat(sada @ 27.08.2011, 10:40:09 )

@peter13135
$i<9 bo zabraknie towaru

bo ostatni element tablicy ma index 9
Racja

W takim razie pomieszaj tę tablicę, i dopiero potem puść do pętli. Zobacz jak działa ten skrypt:
<?
?>
yorgwarez
27.08.2011, 10:47:06
sada o coś takiego jak napisałeś właśnie mi chodziło:) Tylko pojawia się taka kwestia że skrypt wypisuje chyba wszystkie możliwości par jakie mogą być z elementów tablicy.. A mi chodziło o efekt żeby powstały pary z elementów tablicy jednakże bez powtarzania, po prostu każdej liczbie przypisywana by była inna liczba jaka do tej pory nie wystąpiła i tak tworzyłyby się pary... Chyba trzeba by dodać jakiś warunek/ograniczenie?
peter13135 wyrzuca mi elementy w skrypcie Twoim w brzydki sposób tj. przez array jako tablicę po prostu pokazuje..
peter13135
27.08.2011, 11:37:09
Cytat(yorgwarez @ 27.08.2011, 11:47:06 )

peter13135 wyrzuca mi elementy w skrypcie Twoim w brzydki sposób tj. przez array jako tablicę po prostu pokazuje..
ehh. JA NIE DAŁEM CI W TYM PRZYPADKU GOTOWCA.
Napisałem Ci skrypt który tworzy tablicę typu array(1,2,3,4...,20), następnie ją miesza i wyświetla, żebyś mógł zobaczyć na własne oczy rezultat działania skryptu. Na podstawie tego skryptu i pętli, którą Ci dałem w swoim wcześniejszym poście powinieneś potrafić samodzielnie napisać skrypt, który wypisze te pary liczb.
@sada, mogłeś się powstrzymać, trochę trzeba motywować do samodzielnego myślenia.
sada
27.08.2011, 12:35:33
w takim razie bliżej petera13135
$tablica = array(1
,2
,3
,4
,5
,6
,7
,8
,9
,10
); for($i=0;$i<count($tablica);$i=$i+2){
echo $tablica[$i] . '-' . $tablica[$i+1] . '<br />' ; }
Dominator
27.08.2011, 14:33:22
Mam skrypt który generuje liczby o określonej godzinie i w określone dni. Oczywiście bez powtarzania ich.
<html>
<title>Generator szczesliwego numerka</title>
<body>
<?php
$biezaca_godzina=date('H'); $godzina_losowania="17";
if($dzien=="Sat" || $dzien=="Sun") {
echo 'W dzisiejszym dniu nie sa losowane szczesliwe numerki';
else {
$liczby=file('numerek/numerek.txt'); if ($liczby[2]==$dzien && $biezaca_godzina>=$godzina_losowania) {
echo 'Dzisiejsze szczesliwe numerki to: ';
if($liczby[2]!=$dzien && $biezaca_godzina>=$godzina_losowania) {
while($liczba2==$liczba1) {
$plik=fopen('numerek/numerek.txt', 'w'); fwrite($plik, "$liczba1 - Pierwsza liczba $liczba2 - Druga liczba
$dzien");
echo 'Dzisiejsze szczesliwe numerki to: '; echo $liczba1.', '.$liczba2; }} if($liczby[2]!=$dzien && $biezaca_godzina<$godzina_losowania) {
echo 'Na dzisiejszy dzien nie zostaly jeszcze rozlosowane szczesliwe numerki<br>'; echo 'Losowanie szczesliwych numerkow rozpocznie sie dzis o '.$godzina_losowania.':00'; } ?>
</body>
</html>
yorgwarez
28.08.2011, 21:43:30
peter13135, no okej, skrypt działa i potrafię wypisać te elementy w inny sformatowany sposób, ale jak mam połączyć liczby w cyfry na podstawie tego co mi napisałeś? Tak jak napisał sada kod, to skrypt działa poprawnie tylko wypisuje wszystkie możliwe kombinacje par liczbowych, jak mogę je ograniczyć? Czytałem trochę o sposobach ograniczeń powtarzania się liczb w skryptach losujących ale albo radzą pracować na sesjach i cookies albo w sumie nikt nie znalazł uniwersalnego rozwiązania... Bo chcialem po prostu zmodyfikować rozwiązanie które napisał sada stosując ograniczenie by wypisywało tylko wszystkie możliwe pary raz z danego zakresu a nie wszystkie mozliwe kombinacje.. Żeby utworzyło pary z liczb danego zakresu tablicy wykorzystując wszystkie elementy tablicy losowo i jednokrotnie w przypadkowej kolejności bez powtarzania. Czyli do tego skryptu od sada muszę napisać pętlę by ograniczyć działanie tworzenia par tylko do jednorazowego wyczerpania wszystkich elementów z tablicy?
Przepraszam Was wszystkich za te moje pytania i dziękuję Wam z góry za cierpliwość mi okazaną i pomoc jaką do tej pory od Was otrzymałem. Dominator, patrzę na Twój skrypt i jak ograniczyłeś/wykluczyłeś powtórzenia? Jakieś sugestie jak najłatwiej to można zrobić?
peter13135
29.08.2011, 08:12:55
aby mieć wyniki na stałe, wylosuj raz, przypisz do sesji i będziesz miał na stałe. ewentualnie, jeśli ma to wynik losowania ma być taki sam dla wszystkich odwiedzających, to zserializuj tablicę i zapisz do pliku (funkcje serialize i file_put_contents). Do odczytywania tablicy użyj unserialize i file_get_contents.
Oczywiscie musisz zrobić odpowiednie warunki, jeśli nie ma wolosowanego, to losuj, jeśli jest, to nmie losuj, tlko wczytaj z pliku, czy sesji.
Nie wiem co to znaczy połączyć liczby w cyfry
W jaki sposób chcesz ograniczać skrypt sady ? co chcesz osiągnąć ?
yorgwarez
29.08.2011, 16:34:40
Skrypt sady wypisuje wszystkie możliwe kombinacje par liczbowych utworzonych z zakresu tablicy zdefiniowanego na początku (ilość elementów w tablicy). Ja chciałbym wprowadzić ograniczenie, aby wypisywane były pary powstałe w wyniku losowania i mieszczące się w zakresie elementów tablicy, ale nie wszystkie możliwości, ale tak by każda liczba miała przypisaną inną liczbę (tworząc parę), mieszcząc się w zakresie tablicy bez powtórzeń.
Może na przykładzie będzie prościej - załóżmy że to będzie aplikacja losująca pary piłkarskie w pucharach piłki nożnej. Każda cyfra z tablicy to jedna drużyna. Załóżmy że mamy 8 cyfr w tablicy do wylosowania. Do wylosowania są 4 pary liczb. Ale nie wypisujemy wszystkich możliwych kombinacji par liczbowych, ale chcemy przeprowadzić losowanie i utworzyć 4 losowe pary liczbowe bez powtórzeń. I za każdym uruchomieniem skryptu uczynić to od nowa, czyli losowanie się powtarza ale tworzone są nowe pary wg warunków podanych powyżej.
Jak zmodyfikować skrypt sady, jakie ograniczenie wprowadzić, by wypisywało tylko raz te pary liczbowe a nie wszystkie możliwe kombinacje?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.