ou est l'argument?
ou est l'argument?
ou est l'argument?
http://www.cplusplus.com/reference/algorithm/random_shuffle/
http://www.cplusplus.com/reference/algorithm/random_shuffle/
http://www.cplusplus.com/reference/algorithm/random_shuffle/
je ne suis pas tres bon en anglais :(
je ne suis pas tres bon en anglais :(
je ne suis pas tres bon en anglais :(
j'utilise ce code mais je le comprend pas :(
// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
une fonction "myrandom" qui prend comme argument un ptrdiff_t et qui
retourne un ptrdiff_t (pas d'argument par defaut)
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
son utilisation
random_shuffle (random_position.begin(), random_position.end(),
p_myrandom);
ou est l'argument?
j'utilise ce code mais je le comprend pas :(
// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
une fonction "myrandom" qui prend comme argument un ptrdiff_t et qui
retourne un ptrdiff_t (pas d'argument par defaut)
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
son utilisation
random_shuffle (random_position.begin(), random_position.end(),
p_myrandom);
ou est l'argument?
j'utilise ce code mais je le comprend pas :(
// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
une fonction "myrandom" qui prend comme argument un ptrdiff_t et qui
retourne un ptrdiff_t (pas d'argument par defaut)
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
son utilisation
random_shuffle (random_position.begin(), random_position.end(),
p_myrandom);
ou est l'argument?
p_myrandom est aussi un argument, qui donne à random_shuffle, la
fonction à utiliser pour obtenir un aléa; cet aléa définissant
l'index (entre 0 et n-1) de l'élément à permuter avec l'élément n
dans la boucle parcourue par random_shuffle.
p_myrandom est aussi un argument, qui donne à random_shuffle, la
fonction à utiliser pour obtenir un aléa; cet aléa définissant
l'index (entre 0 et n-1) de l'élément à permuter avec l'élément n
dans la boucle parcourue par random_shuffle.
p_myrandom est aussi un argument, qui donne à random_shuffle, la
fonction à utiliser pour obtenir un aléa; cet aléa définissant
l'index (entre 0 et n-1) de l'élément à permuter avec l'élément n
dans la boucle parcourue par random_shuffle.
Sylvain SF wrote:p_myrandom est aussi un argument, qui donne à random_shuffle, la
fonction à utiliser pour obtenir un aléa; cet aléa définissant
l'index (entre 0 et n-1) de l'élément à permuter avec l'élément n
dans la boucle parcourue par random_shuffle.
mais bien sur, (la taille du vector) parfois je suis un peu "lourd"
Sylvain SF <sylvain@boiteaspam.info> wrote:
p_myrandom est aussi un argument, qui donne à random_shuffle, la
fonction à utiliser pour obtenir un aléa; cet aléa définissant
l'index (entre 0 et n-1) de l'élément à permuter avec l'élément n
dans la boucle parcourue par random_shuffle.
mais bien sur, (la taille du vector) parfois je suis un peu "lourd"
Sylvain SF wrote:p_myrandom est aussi un argument, qui donne à random_shuffle, la
fonction à utiliser pour obtenir un aléa; cet aléa définissant
l'index (entre 0 et n-1) de l'élément à permuter avec l'élément n
dans la boucle parcourue par random_shuffle.
mais bien sur, (la taille du vector) parfois je suis un peu "lourd"
- si je considère valide l'implémentation P.J. Plauger de <algorithm>,
cet argument transmis à myrandom ne sert strictement à rien
- si je considère valide l'implémentation P.J. Plauger de <algorithm>,
cet argument transmis à myrandom ne sert strictement à rien
- si je considère valide l'implémentation P.J. Plauger de <algorithm>,
cet argument transmis à myrandom ne sert strictement à rien
Sylvain SF a écrit :
> - si je considère valide l'implémentation P.J. Plauger de
> <algorithm>, cet argument transmis à myrandom ne sert
> strictement à rien
en fait si, quand même.
ce point illustre d'ailleurs bien 2 trucs plutôt agaçant de la STL:
1:
<http://www.cplusplus.com/reference/algorithm/random_shuffle/>
prétends illustrer le bon usage de la STL (enfin que pense
qu'il souhaite s'inscrire dans cette démarche) et utilise un
affreux typedef implicite:
<quote>
// random generator function:
ptrdiff_t myrandom(ptrdiff_t i) { return rand() % i;}
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
</quote>
pour faire
random_shuffle(myvector.begin(), myvector.end(), p_myrandom);
le bon usage de la STL voudrait plutôt:
ptrdiff_t myrandom(ptrdiff_t i) { return rand()%i; }
random_shuffle(myvector.begin(), myvector.end(),
pointer_to_unary_function<int, int>(myrandom));
où pointer_to_unary_function vérifiera correctement la
définition et refuserait mon int modularRandomGenerator(...).
2: selon <http://www.sgi.com/tech/stl/RandomNumberGenerator.html>
le contrat d'une fonction /Random Number Generator/ est de retourner
un nombre compris entre 0 et l'argument reçu.
pourquoi alors l'implémentation de random_shuffle (celle de
Plauger) perd son temps à refaire un modulo sur le nombre
retourné ?
qu'est-ce que ce système où on fixe un contrat et
on opère comme s'il n'était pas respecté ?
où est le bon sens et la charge du respect du contrat ? et
non, je refuse d'emblée le "c'est plus sur" ainsi, "2 tests
valent mieux qu'un" et autres enfantillages.
Sylvain SF a écrit :
> - si je considère valide l'implémentation P.J. Plauger de
> <algorithm>, cet argument transmis à myrandom ne sert
> strictement à rien
en fait si, quand même.
ce point illustre d'ailleurs bien 2 trucs plutôt agaçant de la STL:
1:
<http://www.cplusplus.com/reference/algorithm/random_shuffle/>
prétends illustrer le bon usage de la STL (enfin que pense
qu'il souhaite s'inscrire dans cette démarche) et utilise un
affreux typedef implicite:
<quote>
// random generator function:
ptrdiff_t myrandom(ptrdiff_t i) { return rand() % i;}
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
</quote>
pour faire
random_shuffle(myvector.begin(), myvector.end(), p_myrandom);
le bon usage de la STL voudrait plutôt:
ptrdiff_t myrandom(ptrdiff_t i) { return rand()%i; }
random_shuffle(myvector.begin(), myvector.end(),
pointer_to_unary_function<int, int>(myrandom));
où pointer_to_unary_function vérifiera correctement la
définition et refuserait mon int modularRandomGenerator(...).
2: selon <http://www.sgi.com/tech/stl/RandomNumberGenerator.html>
le contrat d'une fonction /Random Number Generator/ est de retourner
un nombre compris entre 0 et l'argument reçu.
pourquoi alors l'implémentation de random_shuffle (celle de
Plauger) perd son temps à refaire un modulo sur le nombre
retourné ?
qu'est-ce que ce système où on fixe un contrat et
on opère comme s'il n'était pas respecté ?
où est le bon sens et la charge du respect du contrat ? et
non, je refuse d'emblée le "c'est plus sur" ainsi, "2 tests
valent mieux qu'un" et autres enfantillages.
Sylvain SF a écrit :
> - si je considère valide l'implémentation P.J. Plauger de
> <algorithm>, cet argument transmis à myrandom ne sert
> strictement à rien
en fait si, quand même.
ce point illustre d'ailleurs bien 2 trucs plutôt agaçant de la STL:
1:
<http://www.cplusplus.com/reference/algorithm/random_shuffle/>
prétends illustrer le bon usage de la STL (enfin que pense
qu'il souhaite s'inscrire dans cette démarche) et utilise un
affreux typedef implicite:
<quote>
// random generator function:
ptrdiff_t myrandom(ptrdiff_t i) { return rand() % i;}
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
</quote>
pour faire
random_shuffle(myvector.begin(), myvector.end(), p_myrandom);
le bon usage de la STL voudrait plutôt:
ptrdiff_t myrandom(ptrdiff_t i) { return rand()%i; }
random_shuffle(myvector.begin(), myvector.end(),
pointer_to_unary_function<int, int>(myrandom));
où pointer_to_unary_function vérifiera correctement la
définition et refuserait mon int modularRandomGenerator(...).
2: selon <http://www.sgi.com/tech/stl/RandomNumberGenerator.html>
le contrat d'une fonction /Random Number Generator/ est de retourner
un nombre compris entre 0 et l'argument reçu.
pourquoi alors l'implémentation de random_shuffle (celle de
Plauger) perd son temps à refaire un modulo sur le nombre
retourné ?
qu'est-ce que ce système où on fixe un contrat et
on opère comme s'il n'était pas respecté ?
où est le bon sens et la charge du respect du contrat ? et
non, je refuse d'emblée le "c'est plus sur" ainsi, "2 tests
valent mieux qu'un" et autres enfantillages.
Bruno Causse a écrit :
2 remarques:
- ce n'est pas la taille du vector qui est transmis à myrandom mais
l'indice courant; ainsi lors du parcours des éléments du vector,
l'élement i est échangé avec un des éléments de rang 0 à i (non N)
-- et je ne vois pas de forte raison à cela, on pourrait permuter
chaque élément avec n'importe quel autre (et non pas avec un des
éléments précédents).
Par ailleurs la spéc. immédiate (accompagnant
l'implémentation) de random_shuffle étant inexistante, rien
ne permet ici d'affirmer que l'argument reçu par myrandom
doit servir à appliquer un modulo plutôt que toute autre
chose, cela pourrait être une graine (seed) transmis au
générateur pour une éventuelle réinitialisation de sa
séquence.
en application, vous pourriez définir:
int modularRandomGenerator(...){
return rand();
}
typedef int (*ModularRandomGenerator)(...);
ModularRandomGenerator p_myrandom = modularRandomGenerator;
std::vector<long> v;
// fill-in v
random_shuffle(v.begin(), v.end(), p_myrandom);
qui fonctionnera à l'identique.
ou plus simple encore: random_shuffle(v.begin(), v.end());
Bruno Causse a écrit :
2 remarques:
- ce n'est pas la taille du vector qui est transmis à myrandom mais
l'indice courant; ainsi lors du parcours des éléments du vector,
l'élement i est échangé avec un des éléments de rang 0 à i (non N)
-- et je ne vois pas de forte raison à cela, on pourrait permuter
chaque élément avec n'importe quel autre (et non pas avec un des
éléments précédents).
Par ailleurs la spéc. immédiate (accompagnant
l'implémentation) de random_shuffle étant inexistante, rien
ne permet ici d'affirmer que l'argument reçu par myrandom
doit servir à appliquer un modulo plutôt que toute autre
chose, cela pourrait être une graine (seed) transmis au
générateur pour une éventuelle réinitialisation de sa
séquence.
en application, vous pourriez définir:
int modularRandomGenerator(...){
return rand();
}
typedef int (*ModularRandomGenerator)(...);
ModularRandomGenerator p_myrandom = modularRandomGenerator;
std::vector<long> v;
// fill-in v
random_shuffle(v.begin(), v.end(), p_myrandom);
qui fonctionnera à l'identique.
ou plus simple encore: random_shuffle(v.begin(), v.end());
Bruno Causse a écrit :
2 remarques:
- ce n'est pas la taille du vector qui est transmis à myrandom mais
l'indice courant; ainsi lors du parcours des éléments du vector,
l'élement i est échangé avec un des éléments de rang 0 à i (non N)
-- et je ne vois pas de forte raison à cela, on pourrait permuter
chaque élément avec n'importe quel autre (et non pas avec un des
éléments précédents).
Par ailleurs la spéc. immédiate (accompagnant
l'implémentation) de random_shuffle étant inexistante, rien
ne permet ici d'affirmer que l'argument reçu par myrandom
doit servir à appliquer un modulo plutôt que toute autre
chose, cela pourrait être une graine (seed) transmis au
générateur pour une éventuelle réinitialisation de sa
séquence.
en application, vous pourriez définir:
int modularRandomGenerator(...){
return rand();
}
typedef int (*ModularRandomGenerator)(...);
ModularRandomGenerator p_myrandom = modularRandomGenerator;
std::vector<long> v;
// fill-in v
random_shuffle(v.begin(), v.end(), p_myrandom);
qui fonctionnera à l'identique.
ou plus simple encore: random_shuffle(v.begin(), v.end());
2 remarques:
- ce n'est pas la taille du vector qui est transmis à myrandom mais
l'indice courant; ainsi lors du parcours des éléments du vector,
l'élement i est échangé avec un des éléments de rang 0 à i (non N)
-- et je ne vois pas de forte raison à cela, on pourrait permuter
chaque élément avec n'importe quel autre (et non pas avec un des
éléments précédents).
Pour avoir une distribution aléatoire. Si à chaque fois tu
échanges un élément avec n'importe quel autre, tu vas avoir n^n
différents mélanges. Or, il y a exactement n! ordres possible.
Au moins que n! est facteur de n^n (ce qui n'est pas possible),
il y aurait certains ordres qui ressortent plus que d'autres.
2 remarques:
- ce n'est pas la taille du vector qui est transmis à myrandom mais
l'indice courant; ainsi lors du parcours des éléments du vector,
l'élement i est échangé avec un des éléments de rang 0 à i (non N)
-- et je ne vois pas de forte raison à cela, on pourrait permuter
chaque élément avec n'importe quel autre (et non pas avec un des
éléments précédents).
Pour avoir une distribution aléatoire. Si à chaque fois tu
échanges un élément avec n'importe quel autre, tu vas avoir n^n
différents mélanges. Or, il y a exactement n! ordres possible.
Au moins que n! est facteur de n^n (ce qui n'est pas possible),
il y aurait certains ordres qui ressortent plus que d'autres.
2 remarques:
- ce n'est pas la taille du vector qui est transmis à myrandom mais
l'indice courant; ainsi lors du parcours des éléments du vector,
l'élement i est échangé avec un des éléments de rang 0 à i (non N)
-- et je ne vois pas de forte raison à cela, on pourrait permuter
chaque élément avec n'importe quel autre (et non pas avec un des
éléments précédents).
Pour avoir une distribution aléatoire. Si à chaque fois tu
échanges un élément avec n'importe quel autre, tu vas avoir n^n
différents mélanges. Or, il y a exactement n! ordres possible.
Au moins que n! est facteur de n^n (ce qui n'est pas possible),
il y aurait certains ordres qui ressortent plus que d'autres.