Autor Zpráva
sloncz
Profil
Zdravím, mám v databázi cca 20 vět a potřebuji z nich sestavit dlouhý text.
Tedy script, který mi z databáze vytáhne všech 20 vět a sestaví z nich jeden dlouhý text, na další řádek další dlouhý text ze všech 20 vět ale s tím, že ty věty budou mít zase jiné pořadí, na třetím řádku to zase vezme všech 20 vět a sestaví dlouhý text ale vždycky tak, aby se nikdy neopakovalo stejné pořadí vět jako už se vygenerovalo na řádku výše. Nechci po vás přímo celý script, jen návrh jak by toto šlo zrealizovat a třeba i menší ukázku toho, jak sestavit náhodné pořadí vět tak aby se to neopakovalo. Předem děkuji všem
Chro.
Profil
Věty do pole, pak použít
http://php.net/manual/en/function.shuffle.php
a implodovat podle mezery.
$vety = array(
'Kočka leze dírou.',
'Pes skáče oknem.',
'Santa se spouští komínem.',
'Exekutor chodí dveřmi.'
);
for ($i = 0; $i < 3; $i++)
{
shuffle($vety);
echo implode(' ', $vety).'<br>';
}
sloncz
Profil
jdu se do toho pustit, díky moc :)
Chro.
Profil
Při 20 větách a 3 řádcích není třeba vymýšlet nějaký složitější algoritmus, aby se text na řádcích neopakoval. Funkce shuffle naposledy zamíchaným polem opět dostatečně zamíchá. Nemáš zač.
sloncz
Profil
Ano, u malého množství vět to funguje skvěle, ale co třeba při 50 větách, 50 řádcích? To bych tam musel přidat podmínku jestli už daný řádek existuje nebo ne, ale nevím v jké proměnné bych mohl kontrolovat, zda už daný řetězec existuje nebo ne.
Chro.
Profil
Můžeš samozřejmě kontrolovat, zda daný řetězec již existuje, opticky ale bude lépe vypadat, pokud všechny řetězce v rámci daného počtu řádků budou začínat jinak, což také zajistí požadovanou jedinečnost. V tomto případě počet řádků nesmí převyšovat počet vět. Ale jinak tedy
//definování pole s 50 větami
$vety = range(1, 50);
$pocet_radku = 50;
$kontrolni_pole = array();
while(TRUE)
{
shuffle($vety);
$blok_textu = implode(' ', $vety);
if (in_array($blok_textu, $kontrolni_pole)) continue;
echo $blok_textu.'<br>';
if ($pocet_radku === 1) break;
$pocet_radku--;
$kontrolni_pole[] = $blok_textu;
}
Keeehi
Profil
sloncz:
Počet možných usopřádání roste velmi rychle. Například už při 13ti prvcích přesahuje možnosti klasického integeru. Při 50ti je to něco kolem 3 * 10^64.

Jde vytvořit funkce, která vezme nějaké číslo v rozsahu 1 až počet permutací ((počet vět)!) a vrátí dané pořadí.
Vstupy a výstupy pro 3 věty:
1 => [věta 1, věta 2, věta 3]
2 => [věta 1, věta 3, věta 2]
3 => [věta 2, věta 1, věta 3]
4 => [věta 2, věta 3, věta 1]
5 => [věta 3, věta 1, věta 2]
6 => [věta 3, věta 2, věta 1]

Pak si stačí vybrat jakákoli rozdílná čísla z daného intervalu a máte zaručeno, že ty výstupy budou poaždé jinak seřazené. Má to malinkatý háček, ty čísla si můžete samozřejmě vybrat náhodně jaké chcete, ovšem teoreticky si taky můžete vybrat sekvenci po sobě následujích čísel. Když je pak přetransformujete, dostanete několik pořadí, které vždy začínají stejně a liší se pořadím jen v pár posledních prvcích. Pokud nehodláte vybírat sekvence, tak je to ok. Pokud byste však chtěl vybírat sevence, tak i to se dá kompenzovat. Předřadí se tomu funkce, která provede bijektivní zobrazení (každému číslu 1-6 se přiřadí právě jedno číslo z množiny 1-6, každé přiřazené číslo se už znovu nepoužije). Tato funkce se dá realizovat více způsoby. Na tomto přiřazení pak záleží náhodnost výběru těch seřeazených seznamů pokud se bude výbírat tou sekvencí čísel.

V zásadě to není nic těžkého, jen trochu matematiky.
Závěrem bych chtěl ještě poznamenat, že jelikož se tu vždy pracuje s náhodou, není nikdy možné zaručit, že vybraná pořadí si nebudou podobná. Při velkém počtu možností a malém počtu výběrů je vša tato pravděpodobnost malá.
Pak by se daly ještě vytvořit metriy, které by porovnávaly nově vygenerované pořadí s těmi předchozími a pro určité míry podobnosti by toto řešení odmítaly. To už ale není tak jednoduché. Nakonec vždy záleží pro jaký účel toto vžechno má být a k tomu zvolit adekvátně dobré řešení.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0