Foros del Web » Programación para mayores de 30 ;) » Java »

generar preguntas aleatorias

Estas en el tema de generar preguntas aleatorias en el foro de Java en Foros del Web. Hola a todos.. estoy realizando un servicio web, para emitir el voto a través del telefono celular para la institucion donde estudio, para las elecciones ...
  #1 (permalink)  
Antiguo 06/09/2004, 09:47
 
Fecha de Ingreso: septiembre-2004
Mensajes: 17
Antigüedad: 19 años, 7 meses
Puntos: 0
generar preguntas aleatorias

Hola a todos.. estoy realizando un servicio web, para emitir el voto a través del telefono celular para la institucion donde estudio, para las elecciones del sindicato y del consejo estudiantil. Utilizo servlets y wml, mi problema es:
para cuesntiones de seguridad en mi servicio, primero mando una pantalla al celular donde pregunto el numnero de control y el nombre, checo en la base de datos que existan los datos enviados por el elector, si existen el siguente paso sera hacerle 5 preguntas (edad, telefono,CURP, ,,ETC) las cuales deben ser escogidas al azar de una base de datos que tiene 10 preguntas, ( en la base de datos ya estan almacenadas las respuestas de los electores, las cuales fueron hechas con anterioridad) , ya tengo el random para los numeros de las posibles preguntas, pero no puedo relacionar la dupla de los datos que obtengo del resulSet con los que me genera el random,
he pensado almacenar los datos en un vector y comparar los indices con los numeros que me genera el randon, solo que no se utilizar los vectores, pues soy un novato del lenguaje JAVA..

podrian ayudarme por favor?..

AGRADCERE MUCHISIMO SU PRONTA RESPUESTA..

SALUDOS
  #2 (permalink)  
Antiguo 06/09/2004, 13:21
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
por que no haces el random y luego mediante el numeorqueetd e, sacas la pregunta de la base de datos, es decir, pon en la tabla de las preguntasun ID auto incrementable, de esa manera todas las preguntas estaran asociadas a un numero del 1 al 10, luego haces es random, y el numero que de seleccionas
ejemplo

int num = Integer.parseInt((Math.random()*5));

String sql = "SELECT pregunta FROM tabla_preguntas WHERE id=" + num;

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #3 (permalink)  
Antiguo 06/09/2004, 14:21
Avatar de kripton  
Fecha de Ingreso: diciembre-2002
Ubicación: Zaragoza
Mensajes: 296
Antigüedad: 21 años, 4 meses
Puntos: 0
La solución que te propone goncafa me parece bastante adertada

Aunque si las preguntas son siempre las mismas yo cargaría todas las posibles preguntas en un vector estático al arrancar el sistema y luego tiraría contra el índice del vector para enviar una u otra (evitando accesos innecesarios contra la base de datos).

El código para cargar el vector sería similar a esto:

Código PHP:
Public static Vector datos = new Vector();

------------------------------------------
try {
  
String url="jdbc:mysql://localhost:3306/mydb";
  
String user="bla";
  
String password="blabla";
  
Connection con DriverManager.getConnection(urluserpassword);
  
Statement stmt con.createStatement();
  
ResultSet result stmt.executeQuery("SELECT texto_pregunta FROM cuestiones");
  while (
result.next()) {
    
datos.add(result.getString("texto_pregunta"));
  }
}
----------------------------------------------------- 

Luego para recogerlo podría ser:
Código PHP:
String pregunta = (String) datos.get(Integer.parseInt((Math.random()*5))); 
Nota: Ahora no recuerdo exactamente lo que devolvia la funcion Math.random() pero probablemente haya que revisar esto para asegurarse que su rango va de 0 a 4

Espero te sirva,
saludetes
kripton
__________________
Hoy por ti, mañana por mi. Compartiendo entre amigos.

Usuario Registrado Linux #327495
  #4 (permalink)  
Antiguo 06/09/2004, 14:44
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
Pueses verdad, lasegunda solucion es aun mas efectiva que la mia en terminos de ahorrar recursos del sistema

Y aclarando la duda kripton, el metodo random() devuelve un numero aleatorio entre 0 y 1, por eso para sacar un numero aleatorio entre por ejemplo 0 y 5 se multipicalo que arroja por 5, o por10, o por lo que quieras tener tu numero aleatorio.

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo
  #5 (permalink)  
Antiguo 07/09/2004, 10:44
 
Fecha de Ingreso: septiembre-2004
Mensajes: 17
Antigüedad: 19 años, 7 meses
Puntos: 0
okis gracias

gracias goncafa y kripton. ya probe los codigos que me proporcionaste, bueno tengo varias preguntas:
1. dentro de mi servlet pongo el codigo que genera el random ordenado, ¿como le pudo hacer para que ese codigo lo saque a una clase y solo la mande atraer cunado lo necesite, y como mandarla atraer desde el servlet?
2. el resultado que me de el arreglo del los 5 numeros aleatorios, los tengo que comparar con los indices del ventor para ver a que numeros de preguntas corresponde y asi mandar a imprimir la pregunta,
te mando el codigo.



public static Vector datos = new Vector();
________________________________________

todo lo de conexion ya lo hice
_______________
{
/**+++ aqui va lo de generar preguntas */


String qry1="select * from preguntas where no_ctrl=\'"+control2+"\' ";
Statement stmt2 = conn1.createStatement ();
if (stmt2.execute (qry1))
{
ResultSet results1 = stmt2.getResultSet();


// COMIENZA EL RANDOM

int limiteSup=10, limiteInf =3;
int n[]=new int[5], i, k;

for (i=0; i<n.length; i++)
{
//Obtener un número aleatoreio
n[i] = (int)((limiteSup - limiteInf + 1) * Math.random() + limiteInf);

//Verificar si ya existe el ultimo número obtenido

for (k =0; k < i; k++)
if (n[k] == n[i]) // ya existe
{
i--; //i será incrementado por el for externo
break; //salir de este for
}
}

// Clasificar la matriz

Arrays.sort(n);
//Mostrar la matriz

for (i=0; i <n.length; i++)

System.out.print(n[i]+ " ");
//System.out.println();
//TERMINA RANDOM

while ( results1.next())
{
datos.add(results1.getString("edad")));
  #6 (permalink)  
Antiguo 07/09/2004, 11:40
Avatar de goncafa  
Fecha de Ingreso: julio-2002
Ubicación: Santiago
Mensajes: 1.211
Antigüedad: 21 años, 10 meses
Puntos: 10
Eso que preguntas es la uno es bastantesencillo, y aqui te dejoel ejemplo mas o menos de lo quepides

clase Aleatorios.java
Código PHP:
public class Aleatorios {
    
//cone ste metodo retonamos el arreglo lleno y le pasamos como
    //parametro el numero de aleatoriosque queremos y entre los
             //numeros que se quiere obtener los aleatorios
    
public int[] getAleatorios(int cantidadint hasta) {
        
int num[] = new int[cantidad];
        
        for(
int i 0cantidadi++) {
            
//generamos el numero aleatorio
            
int alea = (int) (Math.random() * max);
            
            
//ingresamos el numero al arreglo
            
num[i] = alea;
            
            
//vemos si existe o no ya el numero, para ello se ejcuta
            //un nuevo ciclo hasta cantidad - 1 para que no se compare
            //el numero a si mismo
            
for(int j 0< (cantidad 1); j++) {
                if(
num[j] == alea) {
                    
//el numero ya existia por tanto se baja el i para que no se tome en cuenta
                    //el ultimo numeroingresado y asi se borra en la siguiente iteracion
                    
--i;
                    
                    
//como ya lo encontramos no vale la pena segir ejecutando
                    //este cilo por tanto lo terminamos
                    
break;
                }
            }    
        }
        
        
//en estepunto ya tenemos generado el los numeros sin repetirse
        //por ende los retonamos
        
return num;
    }

ahora el Servlet

Preguntas.java
Código PHP:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.*;

public class 
Foro extends HttpServlet {
    
Vector preguntas;
    
Connection con;
    
ResultSet res;
    
Statement stm;
    public 
void init() throws ServletException {
        
super.init();
        
        
//todoe sto lo hacemos en este metodo pues solose ejcuta una vez
        //la primera vez que se pide el servlet, por ende la conexion a la BD
        //solo sera aca y la dejamos cerrada y nuetro vector lleno
        
preguntas = new Vector();
            
            
//nos conectamos a labase de datos
            
String dbName "nombre_db";
            
String user "nombre_usuario";
            
String password "password";
            
            try {
                Class.
forName("com.mysql.jdbc.Driver").newInstance();
                
                try {
                    
con DriverManager.getConnection("jdbc:mysql://localhost:3306/" dbName,
                                                    
userpassword);
                                                    
                    
stm con.createStatement();
                    
                    
String sql "SELECT * FROM tabla_preguntas";
                    
                    
res stm.executeQuery(sql);
                    
                    
//llenamos el vector
                    
while(res.next()) {
                        
preguntas.add(res.getString("campo_pregunta"));
                    }
                    
                    
//cerramos la conexion
                    
con.close();
                    
stm.close();
                    
res.close();
                } catch(
SQLException sqlE) {
                    
//fallo la base de datos
                
}
            } catch(
Exception e) {
                
//no se cargo el driver
            
}
    }
    
    public 
void doGet(HttpServletRequest request,HttpServletResponse response
        
throws ServletExceptionIOException {
            
//aca ya esta nuestro vector lleno y para todaslas siguientes peticiones
            //a este servlet se ocupara el mismo y ya no sevolevera a conectar
            //a la base de datos hasta que no se reinicie el servidor
            
            //ahora regogemos nuestros 5 numeros aleatorios
                                       //entre 1 y 10
            
int alea[] = new Aleatorios().getAleatorios(510);
            
            
//imprimimos nuestras preguntas
            
response.setContentType("text/html");
            
PrintWriter out response.getWriter();
            
            for(
int i 0alea.lengthi++) {
                
out.println((1) + ".-" preguntas.elementAt(i));
            }
        }

Asi seria mas menos lo quieres.

Saludos
__________________
se despide hasta la proxima
Gonzalo Castillo

Última edición por goncafa; 07/09/2004 a las 15:23
  #7 (permalink)  
Antiguo 20/09/2004, 13:36
 
Fecha de Ingreso: septiembre-2004
Mensajes: 17
Antigüedad: 19 años, 7 meses
Puntos: 0
no sale las preguntas

Hola chicos, ya probe los codigos que me mandaron, muchas gracias,, lo del random ya lo hace. lo que no hace es:

el generar la pregunta: ya que los valores que le paso al vector son los metadatos de la tabla, y lo que imprimo es el resultado de la pregunta, no la pregunta, pero solo las 5 primeras en orden asendente, tal y como fueron almacenandas en la BD. y no toma en cuanta los nuemros aleatorios que se generarron, ademas solo imprime una pregunta en la pantalla del celular( alguien me podria decir, como puedo imprimir las 5 preguntas guntas?), en el explorador si imprime las 5 pero yo lo necesito para presentar en le celular.. por favor me podriaN AYUDAR...

SALUDOS...

les mando el codigo del servlet que arme con sus codigos.


import java.sql.*;
import java.util.*;
import java.io.*;

class Muestra {

public Muestra()
{
}

public static void main( String args[] )
{
Vector preguntas;
System.out.println( "Tabla preguntas de la base de datos -votos-" );

// nombre del controlador JDBC y URL de la base de datos
String CONTROLADOR_JDBC = "sun.jdbc.odbc.JdbcOdbcDriver";
String URL_BASEDEDATOS = "jdbc:odbc:conectar";
Connection conexion;
Statement instruccion;
preguntas = new Vector();
// conectarse a la base de datos votos y consultar la base de datos
try {

// cargar clase de controlador de base de datos
Class.forName( CONTROLADOR_JDBC );

// establecer conexión a la base de datos
conexion = DriverManager.getConnection( URL_BASEDEDATOS );

// crear objeto Statement para consultar la base de datos
instruccion = conexion.createStatement();

// consultar la base de datos
ResultSet conjuntoResultados = instruccion.executeQuery( "SELECT * FROM preguntas where no_ctrl=96091200" );
ResultSetMetaData metaDatos = conjuntoResultados.getMetaData();
int numeroDeColumnas = metaDatos.getColumnCount();

while(conjuntoResultados.next()) {
preguntas.add(conjuntoResultados.getString("id_pre gunta"));
preguntas.add(conjuntoResultados.getString("no_ctr l"));
preguntas.add(conjuntoResultados.getString("edad") );
preguntas.add(conjuntoResultados.getString("no_tel efono"));
preguntas.add(conjuntoResultados.getString("direcc ión"));
preguntas.add(conjuntoResultados.getString("c_p")) ;
preguntas.add(conjuntoResultados.getString("ciudad "));
preguntas.add(conjuntoResultados.getString("estatu ra"));
preguntas.add(conjuntoResultados.getString("deport e_favorito"));

preguntas.add(conjuntoResultados.getString("CURP") );

}
instruccion.close();
conexion.close();

int alea[] = new Numero().getAleatorios(5,10);


for(int i = 0; i < alea.length; i++) {

System.out.println((1 + 1) + ".-" + preguntas.elementAt(i));
}

************************************************
aqui solo lo estoy probando en forma normal sin servlets... pero ya lo pase al servlet y hago esta comparacion de case:

Statement stmt = conn.createStatement ();
System.out.println("oaqui!");
ResultSet conjuntoResultados=stmt.executeQuery("SELECT * FROM preguntas where no_ctrl=\'"+control2+"\'");
ResultSetMetaData metaDatos = conjuntoResultados.getMetaData();
int numeroDeColumnas = metaDatos.getColumnCount();
int alea[] = new Numero().getAleatorios(5,10);

for (int i=0; i < alea.length; i++)
{
switch(alea[i])
{

case 1:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(1));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 2:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(2));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 3:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(3));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 4:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(4));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 5:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(5));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 6:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(6));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 7:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(7));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 8:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(8));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;
case 9:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(9));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
break;

default:
out.println("<wml>");
out.println("<card id=\"card18\">");
out.println("<p>");
out.println(metaDatos.getColumnName(10));
out.println("</p>");
out.println("</card>");
out.println("</wml>");
}
;
}

}catch (Exception e)
{
out.println("<wml>");
out.println("<card id=\"card27\">");
out.println("<p>");


***************** ojala y puedan ayudarme ... porfavor..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:27.