OVH Cloud OVH Cloud

random() et srandom()

13 réponses
Avatar
dante
Bonjour,

Je suis dans un débat concernant ces deux fonctions.

Je dis que ces deux fonctions ne sont pas ANSI/ISO, mais qu'elles sont
juste dans la libc (qui n'est pas le standard).
mes sources :


http://www.dinkumware.com/manuals/

Dans le stdlib.h il y a :
http://www.dinkumware.com/manuals/?manual=compleat&page=stdlib.html

on y voit rand et srand, et non de random ou srandom

une autre source :
http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html

Sur le site de Libc :
à cette page :
http://www.gnu.org/software/libc/manual/html_node/ISO-C.html#ISO-C

"1.2.1 ISO C

The GNU C library is compatible with the C standard adopted by the
American National Standards Institute (ANSI): American National Standard
X3.159-1989—“ANSI C” and later by the International Standardization
Organization (ISO): ISO/IEC 9899:1990, “Programming languages—C”. We
here refer to the standard as ISO C since this is the more general
standard in respect of ratification. The header files and library
facilities that make up the GNU library are a superset of those
specified by the ISO C standard.

If you are concerned about strict adherence to the ISO C standard, you
should use the `-ansi' option when you compile your programs with the
GNU C compiler. This tells the compiler to define only ISO standard
features from the library header files, unless you explicitly ask for
additional features. See Feature Test Macros, for information on how to
do this.

Being able to restrict the library to include only ISO C features is
important because ISO C puts limitations on what names can be defined by
the library implementation, and the GNU extensions don't fit these
limitations. See Reserved Names, for more information about these
restrictions.

This manual does not attempt to give you complete details on the
differences between ISO C and older dialects. It gives advice on how to
write programs to work portably under multiple C dialects, but does not
aim for completeness. "

Pour faire simple la libc, respecte l'ISO mais y ajoute d'autre
fonctions. c'est bien ça ?

Une autre source :
http://wwwwbs.cs.tu-berlin.de/user-taipan/kraxel/gnuinfo/libc/BSD_Random.html

http://wwwwbs.cs.tu-berlin.de/user-taipan/kraxel/gnuinfo/libc/ANSI_Random.html

http://wwwwbs.cs.tu-berlin.de/user-taipan/kraxel/gnuinfo/libc/Pseudo-Random_Numbers.html


Je pense donc que ces fonctions ne sont pas ANSI, mais BSD (cela ce dit ?)
cependant.
En compilant ce programme :

#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("%ld\n",random());
return 0;
}


avec Codde::Blocks (minGW/gcc)

ça me donne une erreur, fonction random non définie

de même avec lcc

(sous windows)

Mais avec GCC sur cygwin (emulateur unix pour windows) ou un unix, cela
fonctionne.

même avec -ansi -pedantic -Wall et autres.


Alors, Ansi ou non ?
Pourquoi cela compile sur unix et non sur windows (API Posix ?) ?

Merci

3 réponses

1 2
Avatar
Eric Levenez
Le 30/07/06 12:41, dans
<44cc8cde$0$6797$, « Emmanuel Delahaye »
a écrit :

Le random() POSIX est normalement plus "aléatoire" que le rand() du
langage C.


Je ne vois pas étant donné que l'implémentation du 'rand() du C' n'est
pas définie... Certes, 1 est > 0...


Il suffit d'aller voir les définition de rand et de random dans la norme
Posix pour voir la différence.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
Emmanuel Delahaye
Le 30/07/06 12:41, dans
<44cc8cde$0$6797$, « Emmanuel Delahaye »

Le random() POSIX est normalement plus "aléatoire" que le rand() du
langage C.
Je ne vois pas étant donné que l'implémentation du 'rand() du C' n'est

pas définie... Certes, 1 est > 0...


Il suffit d'aller voir les définition de rand et de random dans la norme
Posix pour voir la différence.


La différence avec quoi ? Entre le néant et quelque chose, oui, il y a
une différence, mais pas de quoi justifier une échelle de valeur et
prétendre que tel ou tel est meilleure.

On ne peut comparer que des choses comparables.
--
A+

Emmanuel Delahaye



Avatar
Eric Levenez
Le 30/07/06 13:15, dans
<44cc94e6$0$6793$, « Emmanuel Delahaye »
a écrit :

Le 30/07/06 12:41, dans
<44cc8cde$0$6797$, « Emmanuel Delahaye »

Le random() POSIX est normalement plus "aléatoire" que le rand() du
langage C.
Je ne vois pas étant donné que l'implémentation du 'rand() du C' n'est

pas définie... Certes, 1 est > 0...


Il suffit d'aller voir les définition de rand et de random dans la norme
Posix pour voir la différence.


La différence avec quoi ?


Entre la définition des 2 fonctions.

Entre le néant et quelque chose, oui, il y a
une différence, mais pas de quoi justifier une échelle de valeur et
prétendre que tel ou tel est meilleure.


Et bien si, c'est le but de random justement grâce à sa table d'état
ajustable.

On ne peut comparer que des choses comparables.


Disons juste que tu ne t'es pas donné la peine de lire les définitions des
fonctions et que tes affirmations à l'emporte pièce tombent à plat.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.




1 2