Voici un petit bout de code avec une fonction random agrémentée d'un paramètre pouvant altérer le résultat : la valeur bias, allant de -1f à 1f permet de définir si les nombres retournés auront plutôt tendance à être proches de la valeur minimale ou de la valeur maximale.
Si le bias est à 0, le random retourné est homogène, comme la fonction normale.
Pour visualiser ça, j'ai créé ce petit script qui affiche une texture où les pixels sont dessinés aléatoirement (j'ai laissé volontairement un pixel de marge, pour m'assurer que la fonction n'est jamais hors limites)
Le slider permet de faire varier le bias, le rendu est remis à zéro à chaque changement.
La case à cocher "Quick" permet de visualiser plus rapidement le résultat, en dessinant directement des pixels blancs, sinon le rendu par défaut accumule les valeurs RGB pour avoir un affichage plus progressif.
Pour tester, créez une nouvelle scène est assignez ce script à la caméra.
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class RandomBiasTest : MonoBehaviour {
public int textureSize = 256;
Texture2D buffer;
Color[] colorList;
float bias = 0.0f;
float prev_bias = 0f;
bool quick_display = false;
void Start () {
colorList = new Color[textureSize*textureSize];
buffer = new Texture2D(textureSize,textureSize);
int i,j,k = 0;
for(i=0;i<textureSize;i++){
for(j=0;j<textureSize;j++){
colorList[k] = Color.black;
k++;
}
}
buffer.SetPixels(colorList);
}
void Update () {
int x,y,i,j,k = 0;
Color col;
if(bias != prev_bias){
for(i=0;i<textureSize;i++){
for(j=0;j<textureSize;j++){
colorList[k] = Color.black;
k++;
}
}
prev_bias = bias;
}
for(i = 0; i < 10000; i++){
x = RandomBias(1,textureSize-2,bias);
y = RandomBias(1,textureSize-2,0);
if(quick_display){
col = Color.white;
}else{
col = colorList[(y*textureSize)+x];
col.a = 1;
if(col.r < 1){
col.r += 0.1f;
}else if(col.g < 1f){
col.g += 0.1f;
}else if(col.b < 1f){
col.b += 0.1f;
}
}
colorList[(y*textureSize)+x] = col;
}
buffer.SetPixels(colorList);
buffer.Apply();
}
void OnGUI(){
GUI.DrawTexture(new Rect(5,45,textureSize,textureSize),buffer);
bias = GUI.HorizontalSlider(new Rect(5, 5, textureSize, 15), bias, -1f, 1f);
quick_display = GUI.Toggle(new Rect(5,20,50,15),quick_display,"Quick");
}
int RandomBias(int min , int max , float bias = 0f){
return (int)Mathf.Max (min , Mathf.Min (max , RandomBias((float)min , (float)max , bias) ));
}
float RandomBias(float min , float max , float bias = 0f){
float maxval = 1000f;
float maxlog = Mathf.Log(maxval);
bias = Mathf.Max(-1 , Mathf.Min (1 , bias));
float r = Random.Range (1, maxval);
float lval = 0f;
if (bias > 0){
lval = Mathf.Log( r ) / maxlog * maxval;
r = lval * bias + r * (1 - bias);
}
if (bias < 0){
lval = Mathf.Log( r ) / maxlog * maxval;
r = maxval - 1 + lval * bias - r * (1 + bias);
}
r = Mathf.Max (min , min + Mathf.Min (max , (max + 1 - min) * r / maxval));
return r;
}
}