Sobre rojo de WeChat 5 yuanes sobre rojo aleatorio cantidad aleatoria
1 requisito
Método de escritura, sobre rojo fijo sobre rojo aleatorio
Es ¿Sobre rojo fijo igual a cada sobre rojo? El monto de cada sobre rojo es el mismo que el monto de cada sobre rojo. ¿Cuál es el número fijo de sobres rojos? La cantidad es la misma que la cantidad fija del sobre rojo.
La demanda de sobres rojos aleatorios sí lo es. Si la cantidad total de sobres rojos es de 5 yuanes, se deben enviar 10 sobres rojos. El rango aleatorio es de 0,01 a 0,99; se deben distribuir 5 yuanes y la cantidad debe distribuirse normalmente.
(0,99 se puede especificar arbitrariamente, o promedio * 2 - 0,01; por ejemplo, promedio = 5 / 10 = 0,5; (promedio * 2 - 0,01 = 0,99))
2 Análisis de requisitos
2.1 Sobre rojo fijo
Si es un sobre rojo fijo, el algoritmo es el monto del sobre rojo fijo. Como se muestra en la imagen.
f(x)=t;(1lt;=xlt;=num)
image.png
2.2 Sobre rojo aleatorio
Si usamos la función aleatoria rand. rand(0.01, 0.99); sobres rojos aleatorios 10 veces, si el peor de los casos es que el monto del sobre rojo es 0.99, el monto total es 9.9 dólares estadounidenses. Eso sería más de $5. Las cantidades tampoco se distribuirán normalmente. Finalmente, he estado pensando en cómo utilizar funciones matemáticas como aleatorizadores. Pensé en usar una función matemática como generador de sobres rojos aleatorios que puede usarse para generar sobres rojos aleatorios. Puedes utilizar parábolas, funciones trigonométricas y aleatorizadores. Parábola, funciones trigonométricas. Parábola, funciones trigonométricas. Finalmente elija la función del triángulo isósceles. función lineal.
1 Principio del algoritmo
¿Cuál es la cantidad total de sobres rojos que se deben emitir? La cantidad es totalMoney, la cantidad de sobres rojos es num, el rango de cantidad es [min, max], ¿lineal? El programa se muestra en la figura.
image.png
Coordenadas de tres puntos:
(x1, y1) = (1, valor mínimo)
(x2 , y2) = (num/2, valor máximo)
(x3, y3) = (num, valor mínimo)
Determinar linealidad Programa:
$ y = 1.0 * ($x - $x1) / ($x2 - $x1) * ($y2 - $y1) $y1 ; y = 1.0 * ($x - $x2) / ($x3 - $x2) * ($y3 - $y2) $y2; (x2 lt; = x lt; = x3)
Datos corregidos :
y(Hop) = y1 y2 y3... ynum;
y (hop) puede ser totalMoney, lo que indica que la cantidad de "entrada" es demasiado y es necesario corregir los datos y luego disminuirlos en 0,01 cada vez desde (y1, y2, y3....ynum). Hasta que y(juntos) = dinero total.
y(ogether) puede ser lt; totalMoney, lo que indica que el monto es menor que el monto total. Cuando la cantidad es menor que la cantidad total, debe corregir los datos y luego agregarles 0,01 cada vez desde (y1, y2, y3...ynum). Hasta y(total) = dinero total.
2 Ejemplo de principio de algoritmo
Si necesita enviar sobres rojos, el monto total es 11470, el número de sobres rojos es 7400, el rango de monto es [0.01, 3.09] , el programa lineal es como se muestra en la figura.
image.png
3 Diseño de Requisitos
3.1 Diseño de Diagrama de Clases
image.png
3.2 Fuente Diseño de código
/**
*Algoritmo de sobre rojo fijo aleatorio [modo de estrategia]
*
//Configuración de la transmisión datos DTO
clase OptionDTO
{
//¿Sobre rojo total?Cantidad
public $totalMoney;
// Número de paquetes rojos
public $num;
// Inicio del rango
public $rangeStart;
// Rango liquidación
public $rangeEnd;
/?Residuo de sobre rojo aleatorio
public $builderStrategy;
//Residuo de sobre rojo aleatorio
public $randFormatType; //Can_Left: Los datos no son fijos, puede haber residuos No_Left: No puede haber residuos public static function create($totalMoney, $num, $rangeStart, $rangEnd, $builderStrategy , $randFormatType = ' No_Left')
{
$self = new self();
$self-gt;num = $num; p>
$self-gt;rangeStart = $rangeStart;
$self-gt;rangeEnd = $rangEnd;
$self-gt;totalMoney = $totalDinero;
$self-gt;builderStrategy = $builderStrategy;
$self-gt;randFormatType = $randFormatType;
return $self;
}
}
// ¿Lo recibirá el generador de paquetes rojos?
interfaz IBuilderStrategy
{
//Creación de un paquete rojo
función pública create();
//Estableciendo la configuración
función pública setOption( OptionDTO $option);
// ¿Es posible ingresar el sobre rojo?
función pública isCanBuilder() ;
/? Ingrese la función de sobre rojo
función pública fx($x);
}
// Se corrigió EqualPackageStrategy p>
class EqualPackageStrategy implementa IBuilderStrategy {
// ¿Paquetes rojos individuales? Cantidad
public $oneMoney;
//Cantidad
publ
ic $num;
función pública __construct($opción = null)
{
if($opción instancia de OptionDTO)
{
$this-gt;setOption($opción);
}
}
función pública setOption(OptionDTO $opción)
{
$this-gt;oneMoney = $opción-gt;rangeStart;
$this-gt;num = $opción-gt;num;
}
función pública crear()
{
$datos = matriz();
if(false == $this-gt; isCanBuilder())
{
return $data;
}
$datos = matriz();
$this-gt num = $opción-gt;num;
función pública crear()/**
* Crea un sobre rojo aleatorio
* @access public
* @return void
*/
función pública crear()
{
$data = array();
if(false == $this-gt;isCanBuilder())
{
devuelve $datos;
}
$leftMoney = $this-gt;
$ DineroIzquierdo = $DineroIzquierdo - $datos[$i];
$DineroIzquierdo = $DineroIzquierdo - $datos[$i];
}
{ p >
romper;
}
//prejuicio
$afterLeftMoney = (double)$leftMoney 0.01;
$ afterVal = (doble)$val - 0.01;
if( $ afterLeftMoney lt; = 0 amp; amp; $afterVal gt; = $this-gt; minMoney)
{< / p>
$encontrado = 1;
$datos[$clave] = number_format($afterVal, 2,'.','');
$leftMoney = $ afterLeftMoney;
$leftMoney = number_format($leftMoney, 2, '. ,'');
}
}
}
}
/ If ? No hay ningún color rojo decreciente que deba finalizar; de lo contrario, será un bucle infinito
if($found == 0)
{
}
}
p>
return array($leftMoney, $data);
}
}
/Mantener la clase de Entorno para la estrategia
clase RedPackageBuilder
{
//Instancia
protegida estática $_instance = null;
/****
* Instancia singleton(obtener? instancia)
*
* @return MemcacheOperate
*/
público función estática getInstance()
{
if (null === self::
{
self::$_instance = new self();
}
return self::$_instance;
}
/**
* ¿Cuál es la estrategia a utilizar? Reflexión
*
* @param string $type tipo
* @return void
*/
función pública getBuilderStrategy($tipo) {
$clase = $ tipo.'PackageStrategy';
if(class_exists($clase))
devuelve nueva $clase();
}
else
{
lanza nueva excepción ("{ $class } ¡La clase no existe! ") )
}
}
función pública getRedPackageByDTO(OptionDTO $optionDTO)
{
//getStrategy
$builderStrategy = $this- gt; getBuilderStrategy($optionDTO-gt; builderStrategy); //establecer parámetros
$builderStrategy-gt ; setOption( $optionDTO);
return $ builderStrategy-gt; create();
}
}
clase Cliente
{
función estática pública principal($argv)
{