Generar cadenas aleatoriasEscribí este código para generar una cadena aleatoria.Me preguntaba si hay formas mejores o alternativas de hacer esto sin un bucle for.
names default to here(1);
letters={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
randstrlength=100;
randstr="";
for(ii=1, ii<=randstrlength, ii++,
randstr=randstr || letters[Random Integer(26)];
);
randstr;Re: Generar cadenas aleatoriasNo puedo pensar en cómo hacerlo sin un bucle. Random Integer no devuelve un vector aleatorio. Random Index devuelve un vector, pero no duplicados.
Sólo puedo pensar en ser más eficiente. La concatenación de cadenas en un bucle no es eficiente. Lo siguiente debería mejorar un poco.
names default to here(1);
letters={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
randstrlength=100;
idx = J(1,randstrlength);
for(ii=1, ii<=randstrlength, ii++,
idx[ii] = Random Integer(26);
);
randstr=concat items(letters[idx], "");
También me pregunto acerca de la existencia de una solución sin bucle 
Re: Generar cadenas aleatoriasnames default to here(1);
letters={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
randstrlength=100;
idx = J(1,randstrlength, Random Integer(26));
randstr=concat items(letters[idx], "");
¡Hurra! ¡Magia! 
Re: Generar cadenas aleatoriasNames Default To Here( 1 );
randomString = Function( { length }, { letters },
letters = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
Return( letters[J( length, 1, Random Integer( 1, length ) ) ] );
);
Show( randomString( 10 ) );Re: Generar cadenas aleatoriasResidencia en @Mark_Bailey y @peng_liu contribuciones, esto parece funcionar bien
Names Default To Here( 1 );
randomString = Function( { length }, { letters },
letters = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
Return( substitute(concat items(letters[J( length, 1, Random Integer( 1, length ) ) ]), " ", "") );
);
Show( randomString( 10 ) );
tuvo que usar el comando de sustitución para deshacerse de los espacios entre los caracteres.
Re: Generar cadenas aleatorias@SamGardner "elementos concat" tiene un segundo argumento, que puede usar directamente y evitar un sustituto para ser más eficiente.
Re: Generar cadenas aleatorias¡Gracias!Aquí está, un enfoque mucho más simple:
Names Default To Here( 1 );
randomString = Function( { length }, { letters },
letters = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
Return( concat items(letters[J( length, 1, Random Integer( 1, length ) ) ], "") );
);
Show( randomString( 10 ) );Re: Generar cadenas aleatoriasSé que el objetivo era evitar bucles, pero la larga línea de código que contenía todas las letras me estaba molestando. Aquí hay una forma de usar la tabla ascii para generar los caracteres aleatorios. No funcionó con el comando J(), ya que espera números. Tal vez alguien pueda hacer que esto funcione sin tener que usar un bucle.
randstrlength = 100;
lstchars = {};
for each ({i}, 1::randstrlength,
lstchars[i]= hex to char (right(Hex(64+Random integer (26), "integer"),2));
);
randstr = concat items (lstchars, "");
Re: Generar cadenas aleatorias@SamGardner @Mark_Bailey esto es realmente un tema importante. La generación de un vector de números aleatorios es importante en la computación estadística.
Hice cambios en JMP18 OSI, por lo que los ejemplos de una sola línea existentes se ven así

ahora se convierte en algo como esto:

Re: Generar cadenas aleatoriasCreo que la función J() está subestimada. Evalúa su tercer argumento para cada elemento en un orden de filas. Hay tanto que se puede hacer con él sin hacer un bucle explícito en JSL. Gracias por mejorar la Guía de secuencias de comandos con ejemplos más extensos.
Re: Generar cadenas aleatoriasHola a todos,
Dos cosas rápidas para agregar.
1) Si no te gusta la gran tarea de la lista larga (a mí tampoco), puedes hacer esto para configurar tu personaje:
charset = words("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "");
Hago esto todo el tiempo, por pura pereza. Si necesita cadenas de caracteres múltiples, simplemente use un delimitador

2) Técnicamente, J, de hecho, SÍ hace un bucle... rápidamente. Devuelve una matriz, pero puede hacer lo que quiera dentro del ciclo. A continuación, se imprime una negación nixoniana cada vez que se pasa por el bucle y se devuelve una matriz de números de Fibonacci. Tenga en cuenta que i, el índice, se inicializa fuera y se incrementa dentro del bucle.
i = 1;
J( 10, 1,
print(evalinsert("For the ^i^^if(i < 4, words(\!"st,nd,rd\!",\!",\!")[i], \!"th\!")^ time, I'm not a loop!"));
round(1/sqrt(5)*((1+sqrt(5))/2)^i++)
);

Re: Generar cadenas aleatoriasSí, y para ilustrar eso, aquí está el resultado J( 10, 3...) se usa en lugar de J (10, 1, ...) en el ejemplo que di anteriormente (nota: no mostré el registro completo... las primeras 20 líneas de impresión no se muestran. También ignore los abusos literarios como "21", "22", etc.)

Re: Generar cadenas aleatoriasGracias por permitirme usar tu ejemplo, @brady_brady ! Ahora eso se compartirá con los usuarios, en el producto. He actualizado la descripción y los ejemplos. El tuyo será un ejemplo intrigante y divertido para leer 
