CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet résolu : [Python] Obtenir une valeur entre 0 et 1 selon un pourcentage

DébutPage précedente
1
Page suivantePage suivante
Lewul Lewul
MP
Niveau 31
24 janvier 2015 à 14:17:47

Hello,

Sous Maya je query la couleur d'une map (mais seulement la luminance), j'obtiens une valeur entre 0 (noir) et 1 (blanc). J'aimerai que cette même valeur (que j’appellerai "ON") m'en renvoie une autre : soit 0, soit 1.

Le truc c'est que sur la luminance j'obtiens parfois 0.2, ou 0.5, ou encore 0.8, etc. Bref j'aimerai que la valeur ON soit influencée en fonction de ces valeurs là. Par exemple : si ma luminance est égale à 0.3, alors j'ai 30% de chance que la valeur ON soit égale à 1, et logiquement 70% de chance que sa valeur soit égale à 0. De même pour 0.9, 90% de chance que ce soit égale à 1, 10% à 0, etc.

Mais le truc c'est que je ne vois pas comment m'y prendre en Python. Je présume que c'est assez simple finalement. Je suis pas un gros matheux, donc j'ai beau chercher...

Un grand merci pour votre aide !

Dark_Chouhartem Dark_Chouhartem
MP
Niveau 10
24 janvier 2015 à 15:19:57

random.random() -> x in the interval [0, 1)

« uniformément » normalement.

Du coup tu as juste à valoir 1 si tu es dans une partie de longueur ON de [0,1[, on va prendre [0, ON[ (mais tu peux très bien prendre ]1-ON, 1[ si ça te chante, ou [ON/2, 1-ON/2] ou [0, ON/2] ∪ [1-ON/2, 1[ …):

import random
def sample(p):
  if random.random() < p:
    return 1
  else:
    return 0

(le else étant facultatif, tu peux juste mettre « return 0 » désindenté d’un niveau.)

In [3]: [ sample(0.3) for _ in range(20) ]
Out[3]: [1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
Lewul Lewul
MP
Niveau 31
24 janvier 2015 à 16:37:51

Merci pour ta réponse.

Je comprends pas très bien toute cette partie en fait :

"Du coup tu as juste à valoir 1 si tu es dans une partie de longueur ON de [0,1[, on va prendre [0, ON[ (mais tu peux très bien prendre ]1-ON, 1[ si ça te chante, ou [ON/2, 1-ON/2] ou [0, ON/2] ∪ [1-ON/2, 1[ …):"

Dans le premier bout de code que tu écris est-ce que la valeur influe sur le random ? Je veux dire si dans ma fonction sample je lui donne 0.9 j'aurais pas forcément plus de chance d'avoir une valeur supérieur à 0.9 que si je lui donne 0.2 par exemple, non ? Etant donné que c'est complètement random. Il faut que "p" influe sur ce random en fait. Ou alors j'ai mal compris... ?

Merci

Dark_Chouhartem Dark_Chouhartem
MP
Niveau 10
24 janvier 2015 à 17:14:48

Arrrg arrrg, n'écrit pas uniformément et normalement comme ça l'un à coté de l'autre Dark, c'est perturbant !

Ahah, j’avais pas pensé à normale dans ce sens :rire:

Lewul :d) Mettons que tu aies une fonction qui te renvoie une valeur uniformément aléatoire entre 0 et 1, appelons la u.
Si je dis 1 pour une valeur < 0.5 et 0 sinon. Ça signifie que si en tirant mon réel u, je peux tomber n’importe où sur [0,1[ avec autant de chance, en particulier je peux tomber avant la moitié de l’intervalle avec proba ½ et au delà avec proba ½.

Maintenant l’idée de sample c’est d’étendre naturellement ce constat, au lieu de regarder si j’arrive avant la première moitié ou non, je regarde si j’arrive avant le premier p% ou non, ce qui arrive avec proba p%.

Si tu ne vois pas, tu peux faire le dessin de l’intervalle [0,1[ et dessus placer le segment [0,p].

Lewul Lewul
MP
Niveau 31
24 janvier 2015 à 17:26:39

bluepoint_ : c'est pas grand chose c'est juste que dans un script j'ai besoin de ça. Après je pense pas pouvoir en parler plus, enfin c'est mieux je présume.

Dark_Chouhartem : oui mais là en l’occurrence avec 0.5 j'ai forcément une chance sur deux, mais si je veux vraiment influer sur mon random, par exemple si je prend 0.95, alors j'ai trèèèès peu de chance d'avoir une valeur de 0. Mais comment je fais du coup ? Ou alors je te suis pas, désolé j'avoue ne pas être une brute en script :hap:

Dark_Chouhartem Dark_Chouhartem
MP
Niveau 10
24 janvier 2015 à 17:48:50

Ahhh, c’est pas du script, c’est de la p****n de proba.

Tu as un dé à 6 faces, tu renvoies 1 si tu as moins de 4, 0 sinon, alors dans ce cas, tu as 1 avec proba 4/6 = 2/3 et 0 avec proba 1/3…

Maintenant à la place d’un dé qui te renvoie 1,2,…,6, tu as un dé qui te renvoie un réel entre 0 et 1.

Et si t’es pas convaincu:

In [3]: [ sample(0.9) for _ in range(20) ]
Out[3]: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1]

In [4]: [ sample(0.1) for _ in range(20) ]
Out[4]: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

(mais c’est pas un bon argument l’exemple)

NICOLOMBIANO NICOLOMBIANO
MP
Niveau 3
24 janvier 2015 à 19:58:29

Sinon tu le fais en algo.

Boucle x10 pour des pourcentages finissant par 0 ( ici on prendre 20% de chances pour 0 et 80% pr 1 ).
tu random(0 ou 1), t'additionne le tout par ex ca fait 5. Donc 5 est supérieur à 20% donc t'es dans l'autre tranche tu met 1.
Pour des pourcentages genre 33% faire une boucle x100 et aménagé les if d'après.

J'ai jamais testé ça, je viens d'y penser mais ça me parait bon.

Dark_Chouhartem Dark_Chouhartem
MP
Niveau 10
24 janvier 2015 à 21:37:15

NICOLOMBIANO :d) Non, là tu as une loi binomiale.
Et pour voir que ça ne fonctionne pas, il suffit de regarder pour 10% avec X ta variable aléatoire représentant la valeur de la somme des tirages aléatoires fait par ton programme:
Pr[ X = 1 ] = 10 * 1/2 * 1/2^9≃ 1%
C’est assez loin de tes 10%

Pour t’en rendre compte :

In [2]: Counter([ sum(random.randrange(0,2) for _ in range(10)) for _ in range(1000)])
Out[2]: Counter({5: 265, 6: 211, 4: 179, 3: 139, 7: 104, 2: 45, 8: 42, 1: 8, 9: 5, 10: 2})

C’est pas réparti très équitablement…

NICOLOMBIANO NICOLOMBIANO
MP
Niveau 3
24 janvier 2015 à 22:11:54

Ok autant pour moi :)

Dark_Chouhartem Dark_Chouhartem
MP
Niveau 10
24 janvier 2015 à 23:39:33

NICOLOMBIANO :d) Mais si tu veux vraiment te faire chier, tu peux le faire, l’idée est de récupérer la décomposition binaire de ta proba p = Σ_i a_i 2^(-i), par exemple 0.5 = b0.1, 0.625 = b0.101, d’en récupérer les 1 et ensuite de vérifier si un événement de { 0^{i-1}1x | a_i = 1 } arrive (avec x quelconque)

Ce sont des événements disjoints (si on a 1xx on ne peut pas avoir 001 par exemple, puisque ça contredirait le fait que le premier bit de 001 est à 0), et chacun arrive avec probabilité 1/2^k… oh miracle en faisant la somme des probabilités (puisque événements disjoints), on réobtient bien p.

Du coup un algo pour y arriver consiste à tirer des bits aléatoires, de regarder la position du premier 1. Si elle correspond à un 1 dans la décomposition binaire de p, alors c’est bon, on a gagné, sinon on a perdu.

Voilà une implé possible:

import random

def sample(p) :
    i = 1
    while True:
        bit = random.randrange(2)
        if bit == 1:
            if (int( 2**i * p) & 1) == 1 :
                return 1
            else:
                return 0
        else:
            i += 1
Lewul Lewul
MP
Niveau 31
27 janvier 2015 à 22:30:54

Hey,

Je suis con c'était logique le coup du random tout simple en fait... Bref ça marche du coup :hap:

Merci beaucoup !

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment