sql >> Database >  >> RDS >> Mysql

Distributie van RAND() in MySQL

Ik heb de broncode voor de functie niet snel kunnen vinden; het zien ervan kan helpen om een ​​beter antwoord te krijgen. Dat gezegd hebbende, het ziet eruit als een 'nee.. maar een beetje dichtbij'.

Uit documentatie kan ik zien dat het willekeurig probeert te zijn (en optioneel kun je het zaaien); maar er zijn twee kanttekeningen die betekenen dat het misschien niet altijd uniform is als je verwacht dat het eerste nummer in de documentatie staat:

RAND() is not meant to be a perfect random generator. It is a fast way to generate random numbers on demand that is portable between platforms for the same MySQL version. 

d.w.z. de code ervoor is twijfelachtig omdat het een echte generator voor willekeurige getallen is - het is goed genoeg voor de meeste doeleinden, maar kan niet worden vertrouwd voor gebruik in, laten we zeggen, versleuteling, en ik durf te wedden dat het zelfs niet zo kan worden vertrouwd uniform zoals je mag verwachten.

Hun bewering dat het niet perfect is, betekent dat het vrijwel zeker zal falen in ten minste enkele van deze tests; het hoe is nog onduidelijk, maar als het geen perfecte RNG is, zie je geen perfect uniforme verdeling; Ik verwacht hiaten of pieken van bereiken die meer/minder vaak voorkomen.http://www.stat.fsu.edu/pub/diehard/cdrom/pscript/monkey.ps (Er is sindsdien ander werk geweest, maar dit is nog steeds een van de belangrijkste werkzaamheden bij het valideren van RNG's).

Het zou wedden dat de code erachter zeker niet probeer een uniforme distributie te garanderen, want om dit te doen (de geschiedenis bijhouden van wat er al is gebeurd) zou veel geheugen verspillen. In ieder geval, als je al veel waarden hebt gegenereerd met behulp van een perfecte RNG, garandeert niets dat als je waarden tot nu toe allemaal laag waren, de volgende hoog zal zijn. Het zal altijd net zo willekeurig zijn..




  1. Oracle TO_DATE GEEN fout gooien

  2. Hoe gebruik ik regex in MySQL?

  3. mysql varbinary vs varchar

  4. Oracle:rij kopiëren terwijl één veld wordt bijgewerkt