friky.com
← Back to archive

Post

Implementació d’un Algoritme Aleatori per pesos en Java

2005-09-02 Agustí Pons Original post

Random Weighted Chooser in Java

Si alguna vegada us veieu en la necessitat de distribuir uniformement la carrega entre n servidors, però alhora voleu controlar qui rep més carrega amb un sistema de pesos... Aquest es el vostre algoritme.

La idea es simple:

  • Crear l'objecte

  • Fer put de tots els objectes servidor i passant-li un pes (integer i millor que sigui baixet per temes d’eficiència)

  • Per cada petició que tingueu, cridar al get sense paràmetres. L'algoritme s'encarregarà d'obtenir un objecte adient de manera aleatòria però respectant els pesos.

Diagrama técnic que he fet per preparar la implementacio :)
Qui diu servidors, diu qualsevol cosa, en estadística serien boles blanques i negres, vull dir que es pot fer servir qualsevol tipus d'objecte. Fins i tot 'lomplir el sac" amb objectes heterogenis.

``` /* * Creat per Agusti Pons el 20050901 * Class per omplir una "taula" de objectes amb pesos * posteriorment es pot cridar al metode get() per obtenir aleatoriament * pero mantenint el pes un objecte de la taula * GNU license, apons at grupogodo.com */package com.grupogodo.vang.util;import java.util.HashMap;import java.util.Random;public class RandomWGenerator { HashMap list; int max; Random random; int count; public RandomWGenerator() { max=0; list = new HashMap(); random = new Random(); count=0; } public void put (Object p_obj, int p_weigth) { int l_ini_element_index=this.max; int l_end_element_index=this.max+p_weigth; for(int i=l_ini_element_index; i<l_end_element_index; i++) { list.put(i, p_obj); } this.max=l_end_element_index; this.count++; } public Object get () { int r = random.nextInt(this.max); Object l_ret = list.get(r); return l_ret; } public static void main(String args[]) { RandomWGenerator rwg = new RandomWGenerator(); rwg.put("A", 5); for (int i=0; i<10; i++){ System.out.println("*1*-"+rwg.get());} rwg.put("B", 20); for (int i=0; i<10; i++){ System.out.println("*2*-"+rwg.get());} rwg.put("C", 20); for (int i=0; i<10; i++){ System.out.println("*3*-"+rwg.get());} rwg.put("D", 50); for (int i=0; i<10; i++){ System.out.println("*4*-"+rwg.get());} } public int size() { return count; }} ```

Limitacions:
Com que he optat per la simplicitat hi ha una petita limitació. No feu servir números grans com a pesos, ja que, inserto n vegades l'objecte en un HashMap on n es el pes. Si podeu fer servir pesos del 1 al 10 millor que del 1 al 1.000.