Promíchání pořadí pole – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Promíchání pořadí pole – Pascal – Fórum – Programujte.comPromíchání pořadí pole – Pascal – Fórum – Programujte.com

 

Tallmios
~ Anonymní uživatel
2 příspěvky
28. 3. 2016   #1
-
0
-

Zdravím,

mám 5 obrázků a tabulku o 3 řádcích a 6 sloupcích.

V poli mám 2 integerové recordy označující pozici řádku a sloupců.

type
  TCoordinates = record
    row:integer;
    column:integer;
  end;

var
pozice: Array[0..17] of TCoordinates;

Na začátku se mi do pole uloží koordináty.

pozice[0].column:=50; pozice[0].row:=45;
pozice[1].column:=210;pozice[1].row:=45;
pozice[2].column:=370;pozice[2].row:=45;
pozice[3].column:=530;pozice[3].row:=45;
pozice[4].column:=690;pozice[4].row:=45;
pozice[5].column:=850;pozice[5].row:=45;

pozice[6].column:=50;pozice[6].row:=210;
pozice[7].column:=210;pozice[7].row:=210;
pozice[8].column:=370;pozice[8].row:=210;
pozice[9].column:=530;pozice[9].row:=210;
pozice[10].column:=690;pozice[10].row:=210;
pozice[11].column:=850;pozice[11].row:=210;

pozice[12].column:=50;pozice[12].row:=375;
pozice[13].column:=210;pozice[13].row:=375;
pozice[14].column:=370;pozice[14].row:=375;
pozice[15].column:=530;pozice[15].row:=375;
pozice[16].column:=690;pozice[16].row:=375;
pozice[17].column:=850;pozice[17].row:=375;

Potřebuji promíchat pozice koordinátů v poli, poté zvolit prvních pět míst a vložit je obrázkům jako souřadnice. Jak na to?

Nahlásit jako SPAM
IP: 2a00:1028:919b:f32:d138:9...–
peter
~ Anonymní uživatel
3981 příspěvků
29. 3. 2016   #2
-
0
-

A v cem je problem? Nevis, jak se micha?

(Dale, to neni to pascal kod, ale ten snadno najdes googlem)

- Udelas cyklus, treba, do 250, nahodne vyberes dve cisla, prohodis.

cyklus (i<250)
{
a = random(17)
b = random(17)
tmp = pozice[a]
pozice[a] = pozice[b]
pozice[b] = tmp
}

- Nebo. Udelas nove pole a do nej budes skladat nahodna cisla, ktera v tom poli jeste nejsou. Coz ale muze bezet do nekonecna.

pole = [ ]
cyklus (i<17)
{
a = random(17)
cyklus (i<17) je a v poli? ano {nic}, ne {pridej do pole; i++}
}

- A nebo, treba, dnes velice moderni, nahodne serazeni, pokud algoritmus provadi konecny pocet cyklu 

function sortfunc (a,b) {return random()>random() ? a : b;}
array.sort(sortfunc);

Cili, udelas funkci, ktera rozhodne, ktere ze dvou nahodnych cisel je vetsi a podle toho se prehodi radky tabulky (pole). A protoze algoritmus serazeni obvykle pouziva konecny pocet kroku, tak to nebude delat do nekonecna.

- A nebo udelas pole, kde das jako prvni cislo 0 az 17 a jako druhe cislo nahodne cislo. Seradis to podle druheho cisla
 

pole = []
pole[] = [0, random()]; // [0, 0.754821]
pole[] = [1, random()]; // [1, 0.257211]
pole[] = [2, random()]; ... cyklem
function sortfunc (a,b) {return a[1]>b[1] ? a : b;}
pole.sort(sortfunc);
alert(pole[0][0])
alert(pole[1][0])
alert(pole[2][0])
Nahlásit jako SPAM
IP: 2001:718:2601:26c:598:3b6...–
lukas.balaz0
Super člen
29. 3. 2016   #3
-
0
-

#2 peter
za prvé: Z jeho kódu mám pocit, že Tallmios má trochu problém s cyklami :). Alebo má len rád copy-paste

za druhé: Myslím, že najlepší algoritmus na premiešanie poľa je niečo ako: 

cyklus (i<17)
{
a = random(17-i)
tmp = pozice[a]
pozice[a] = pozice[i]
pozice[i] = tmp
}

Najprv zoberieš náhodný prvok a swapneš ho s prvým, potom zasa vyberieš náhodný prvok a swapneš ho s druhým atď.

Nahlásit jako SPAM
IP: 80.242.41.–
peter
~ Anonymní uživatel
3981 příspěvků
29. 3. 2016   #4
-
0
-

No, kdyz myslis... Staci jednoduchy test souctu cisel v danem intervalu. Melo by vyjit vsude stejne cislo, pokud je to dobre rovnomerne promichane i po 100x zmacknuti F5. Jaka nahodicka, ze zrovna od kraju je soucet nejvetsi a klesa do stredu. Cim by to tak mohlo byt? :)

<script>
function rnd(n) {return Math.floor(Math.random()*n);}

function mytest(pozice)
{
var m,n,a,arr, i,j, str;
n = 1000;
a = 10;
m = Math.floor(n/a);
arr = [];
str = '';
for (j=0; j<a; j++)
	{
	arr[j] = 0;
	}
for (i=0; i<n; i++)
	{
	for (j=a-1; j>=0; j--)
		{
		if (i>m*j) {arr[j] += pozice[i]; break;}
		}
	}
str += '<hr>';
str += arr.join(' | ');
return str;
}

var i, a, b, n, tmp, pozice;
str = '';
pozice = [];
n = 1000;
for (i=0; i<n; i++)
	{
	pozice[i] = i;
//	pozice[a] = rnd(n);
	}
str = pozice.join(', ') + str;
str = '<hr>' + str;

for (b=0; b<n; b++)
	{
	a = rnd(n-b);
	tmp = pozice[a];
	pozice[a] = pozice[b];
	pozice[b] = tmp;
	}

str = pozice.join(', ') + str;
str = '<hr>' + str;

str = mytest(pozice) + str;

document.write(str);
</script>
Nahlásit jako SPAM
IP: 2001:718:2601:26c:598:3b6...–
peter
~ Anonymní uživatel
3981 příspěvků
29. 3. 2016   #5
-
0
-

Zkus tam pak tohle. Tez to neudela vyvazene promichani, ale aspon se ty cisla meni.

/*
for (b=0; b<n; b++)
	{
	a = rnd(n-b);
	tmp = pozice[a];
	pozice[a] = pozice[b];
	pozice[b] = tmp;
	}
*/
pozice = pozice.sort(function(){return 0.6 - Math.random();});
Nahlásit jako SPAM
IP: 2001:718:2601:26c:598:3b6...–
lukas.balaz0
Super člen
29. 3. 2016   #6
-
0
-

#5 peter
ok, mám tam chybičku, má tam byť:

a = rnd(n-b)+b;


Ale teda väčšinou sa to prehadzuje od posledného prvku, tam by toto nebolo nutné, ale je to vlastne jedno ...

Nahlásit jako SPAM
IP: 80.242.41.–
lukas.balaz0
Super člen
29. 3. 2016   #7
-
0
-

   

for (b=n-1; b>=0; b--)
{
	a = rnd(b);
	tmp = pozice[a];
	pozice[a] = pozice[b];
	pozice[b] = tmp;
}


Dúfam, že teraz tam už chyba nie je :)

Nahlásit jako SPAM
IP: 80.242.41.–
Tallmios
~ Anonymní uživatel
2 příspěvky
29. 3. 2016   #8
-
0
-

Super. Díky moc, nakonec jsem použil první zmíněný cyklus s náhodným prohozením hodnot. 

Mohlo mě to napadnout hned... nebyl jsem si jistý, zda-li to pro pole funguje stejně jako pro obyčejné proměnné.

Nahlásit jako SPAM
IP: 2a00:1028:919b:f32:d86f:e...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Promíchání šesti polí — založil Eeron

Pořadí elementů — založil Tomas

Pořadí znaků — založil Synett

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý