Génération aléatoire de mots et phrases en SQL

Deux petites fonctions MS SQL Server pour créer des mots et phrases en « bolobolo » c’est à dire avec une vraisemblance importante par rapport au français.

Ces fonctions utilisent une table de fréquence de représentation des lettres dans la langue française, incluant la fréquence d’apparition de l’espace comme séparateur de mots.
Voici la table qui est utilisé pour stocker les fréquences d’apparition des lettres en français :

CREATE TABLE T_CHR
(CHR_ID     SMALLINT NOT NULL PRIMARY KEY,
 CHR_CHAR   CHAR(1) NOT NULL UNIQUE,
 CHR_NB     INT,
 CHR_MIN    INT,
 CHR_MAX    INT);
GO

Et notre échantillon :

INSERT INTO T_CHR VALUES
(0, ' ','322270', '1533912', '1856181'),
(1, 'e','225947', '1307965', '1533911'),
(2, 's','121895', '1186070', '1307964'),
(3, 'a','117110', '1068960', '1186069'),
(4, 'i','115465', '953495', '1068959'),
(5, 't','111103', '842392', '953494'),
(6, 'n','108812', '733580', '842391'),
(7, 'r','100500', '633080', '733579'),
(8, 'u','96785', '536295', '633079'),
(9, 'l','83668', '452627', '536294'),
(10, 'o','82762', '369865', '452626'),
(11, 'd','56269', '313596', '369864'),
(12, 'c','50003', '263593', '313595'),
(13, 'p','46335', '217258', '263592'),
(14, 'm','45521', '171737', '217257'),
(15, 'é','29206', '142531', '171736'),
(16, 'v','24975', '117556', '142530'),
(17, 'q','20889', '96667', '117555'),
(18, 'f','16351', '80316', '96666'),
(19, 'b','13822', '66494', '80315'),
(20, 'g','13288', '53206', '66493'),
(21, 'h','11298', '41908', '53205'),
(22, 'j','8351', '33557', '41907'),
(23, 'à','7449', '26108', '33556'),
(24, 'x','5928', '20180', '26107'),
(25, 'y','4725', '15455', '20179'),
(26, 'è','4160', '11295', '15454'),
(27, 'ê','3445', '7850', '11294'),
(28, 'z','2093', '5757', '7849'),
(29, 'w','1747', '4010', '5756'),
(30, 'ç','1306', '2704', '4009'),
(31, 'ù','890', '1814', '2703'),
(32, 'k','745', '1069', '1813'),
(33, 'î','695', '374', '1068'),
(34, 'Å“','283', '91', '373'),
(35, 'ï','84', '7', '90'),
(36, 'ë','7', '0', '6');
GO

Au passage indexons correctement notre table :

CREATE INDEX X_CHR_MINMAX ON T_CHR(CHR_MIN, CHR_MAX);
GO

Nous avons besoin de cette vue, car notre fonction de génération ne peut pas utiliser directement l’appel à la fonction RAND() non déterministe

CREATE VIEW V_RAND
AS
SELECT RAND() AS RND
GO

Voici maintenant une fonction qui génère un mot (donc une chaine sans espace) :

CREATE FUNCTION dbo.F_GET_ALEA_FMOT(@NBLET TINYINT)
RETURNS VARCHAR(256)
AS
BEGIN
   DECLARE @I INT, @M INT, @C CHAR(1), @S VARCHAR(max);
   SELECT @I = 1, @S = '';
   SELECT @M = CHR_MIN - 1 FROM T_CHR WHERE CHR_CHAR = ' ';
   WHILE @I < @NBLET
   BEGIN
      SELECT @C = CHR_CHAR
      FROM   T_CHR
             INNER JOIN V_RAND
                    ON RND * @M BETWEEN CHR_MIN AND CHR_MAX;
      SELECT @S = @S + @C, @I = @I + 1;
   END
   RETURN @S
END;
GO

Et voici la fonction qui génère une phrase composées de mots séparés par des espaces :

CREATE FUNCTION dbo.F_GET_ALEA_FPHRASE(@NBLET TINYINT)
RETURNS VARCHAR(max)
AS
BEGIN
   DECLARE @I INT, @M INT, @C CHAR(1), @S VARCHAR(max), @B BIT;
   SELECT @I = 1, @S = '', @B = 1;
   SELECT @M = CHR_MAX FROM T_CHR WHERE CHR_CHAR = ' ';
   WHILE @I < @NBLET
   BEGIN
      SELECT @C = CHR_CHAR
      FROM   T_CHR
             INNER JOIN V_RAND
                    ON RND * @M BETWEEN CHR_MIN AND CHR_MAX;
      IF @B = 1 AND @C = ' '
         CONTINUE;              
      SELECT @S = @S + @C, @I = @I + 1;
      SET @B = CASE @C WHEN ' ' THEN 1 ELSE 0 END;
   END
   RETURN @S
END;
GO

Et voici comment tester le tout :

SELECT dbo.F_GET_ALEA_FMOT(8), dbo.F_GET_ALEA_FPHRASE(250)

Ceci génère un mot aléatoire de 8 lettres et une phrase limitée à 250 caractères.

Frédéric Brouard, SQLpro – ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com
MVP Microsoft SQL Server
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation…
* * * * * * Enseignant CNAM PACA – ISEN Toulon – CESI Aix en Provence * * * * * *

Laisser un commentaire