Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » zufalls-permutation

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.08.2004, 11:17 Uhr
kronos
Quotenfisch
(Operator)


Hi,
ich möchte von euch eine Funktion, die zwei Ganzzahlen übernimmt und die Addresse eines Arrays zurückgibt. Der Array soll die beiden Zahlen und alle dazwischen liegenden Zahlen je einmal enthalten, jedoch in zufälliger Reihenfolge. (Die Länge des Arrays hängt also von den beiden Zahlen ab ->malloc).

So sieht das dann aus:

C++:
int *rand_Array(int x,int y)


Zur Verfügung steht die Funktion

C++:
int Rand(int a, int b)

welche eine Zufallszahl im Bereich von a bis b liefert.

Geehrt werden die Autoren der kürzesten sowie der perfomantesten Lösung.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.08.2004, 12:05 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#include <algorithm>
#include <vector>

std::vector<int> rand_vector(int x, int y) {
  std::vector<int> r;
  for(int i = x; i <= y; ++i)
    r.push_back(i);
  std::random_shuffle(r.begin(), r.end());

  return r;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.08.2004, 13:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy


Zitat:

...beiden Zahlen ab ->malloc


ich würde sagen ein eindeutiger hinweis das c zu verwenden ist... dein stl-trick gilt also nicht
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.08.2004, 13:54 Uhr
kronos
Quotenfisch
(Operator)


Gut, aber der Prototyp

C++:
int *rand_Array(int x,int y)

war schon ernst zu nehmen... Er sollte nahelegen das in C zu lösen, wenn du unbedingt willst, kannst du auch vectoren verwenden und in einen Array umtüdeln...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.08.2004, 14:02 Uhr
0xdeadbeef
Gott
(Operator)


Seufz. Meinetwegen auch C:

C++:
/* srand(time(0)) sei schon ausgeführt */
int *rand_Array(int x, int y) {
  int dim = abs(y - x) + 1;
  int *p = calloc(dim, sizeof(int));

  for(int i = 0; i < dim; ++i)
    p[i] = (x < y ? x : y) + i;

  for(int i = 0; i < dim; ++i) { //Uuuuh, das wird VC++ 6 gar nicht gefallen...he he...
    int r = rand() % (i + 1);
    int t = p[i];
    p[i] = p[r];
    p[r] = t;
  }

  return p;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.08.2004 um 14:11 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2004, 14:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm.

Also erstmal was effizient angeht, so ist da ja noch Verbesserungspotential:
1. malloc anstelle von calloc
2. min aus der Schleife rausnehmen
3. Ein Schleifendurchgang unten kann jedenfalls gespart werden...

Wo ich mir aber komplett unsicher bin, ist der Algorithmus:
Nehmen wir mal

C++:
void swap(int*a, int*b) { int t = *a; *a = *b; *b=t; }


als gegeben an.

Dann wäre Beefies Lösung ja:

C++:
...
for(int i = 0; i < dim; ++i) {
    int r = rand() % (i + 1);
    swap(p+i, p+r);
}
...


Aber wie sieht es mit Alternativen aus, zB:

C++:
// A
...
for(int i = 0; i < dim; ++i) {
    int r = rand() % dim;
    swap(p+i, p+r);
}
...


Oder

C++:
// B
...
for(int i = 0; i < (dim+1)/2; ++i) {
    int r = rand() % dim;
    swap(p+i, p+r);
}
...


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2004, 14:48 Uhr
0xdeadbeef
Gott
(Operator)


Deine beiden Alternativen sind auch in etwa das, was ich mir zuerst ausgedacht hatte, aber das ergibt keine gleichmäßige Verteilung. Mit dem rand() % (i+1) ist die Chance für jede Zahl, auf jedem Platz zu landen, genau gleich groß (einmal wird sie selbst auf einen Platz unter sich oder auf der gleichen Position eingeordnet, danach hat sie für jeden höheren Platz genau ein mal die Chance, hin zu kommen - voila, gleichmäßige Verteilung). Das ist bei dem anderen Algo nicht der Fall.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.08.2004, 16:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:


C++:
for(int i = 0; i < dim; ++i) { //Uuuuh, das wird VC++ 6 gar nicht gefallen...he he...




natürlich gibt es auch für dieses Problem eine Lösung, was ja auch kein Fehler im eigentlichen Sinne ist sondern einfach die Tatsache das der VC++ 6 die Blockzugehörigkeit hier anderes interpretiert

ein

C++:
#define for if(1)for


und schon ist man als VC++ 6-User nicht mehr diskriminiert
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.08.2004, 17:01 Uhr
0xdeadbeef
Gott
(Operator)



--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.08.2004, 18:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
kanntest du das etwa noch nicht?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: