2011-05-09 14 views

Respuesta

21
RandomSample[list] 

Sí, es así de simple. Al menos desde la versión 6.

Antes RandomSample se introdujo, se podría utilizar:

#[[ Ordering[Random[] & /@ #] ]] & @ list 
+1

Antes de la versión 6, estaba usando 'Combinatorica'RandomPermutation', que es más rápido y más seguro, ya que nunca puede producir elementos idénticos. –

+0

@Leonid Szabolcs declaró: "Combinatorica también tiene una función RandomPermutation (versiones anteriores). Estoy buscando otras/mejores soluciones, si las hay". Estaba respondiendo con eso en mente, pero debería ser una solución mejor antes de 6.0. –

+0

Vaya, lo he perdido. Pero entonces no entiendo, la solución basada en 'Combinatorica'RandomPermutation' parece superior a mí, ¿por qué molestarse en utilizar una basada en' Random' (esta es una pregunta para @Szabolcs realmente, no para ti)? –

1

Actualmente uso

list[[[email protected]@Length[list]]] 

Esto es para Mathematica 8. Combinatorica también tiene una función RandomPermutation (versiones anteriores).

Estoy buscando otras/mejores soluciones, si hay alguna.

2

Antes de la introducción RandomSample, he utilizado el siguiente grupo matemático-función en gran medida, aunque es más rápido RandomSample al menos por uno magnitud en mi máquina.

In[128]:= n = 10; 
      set = [email protected] 

Out[129]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 

In[130]:= Take[set[[Ordering[RandomReal[] & /@ [email protected]]]], n] 

Out[130]= {8, 4, 5, 2, 3, 10, 7, 9, 6, 1} 

Otro problema además del desempeño es que si los mismos números reales aleatorios se golpean dos veces (poco probable aunque posible,) pedidos no dará estos dos en orden aleatorio.

+0

Perdónenme, pero ese es un código poco fiable que tienen allí. (1) 'RandomReal [] &/@ Range @ n' podría reemplazarse por' Random [] &/@ set' o, por lo general, más rápido 'RandomReal [1, Length @ set]'. (2) 'Take [..., n]' no está haciendo nada aquí y puede eliminarse. Por lo tanto, el código debería ser: 'set [[Ordering @ RandomReal [1, Length @ set]]]' –

+0

En realidad, usar 'RandomReal' no tiene ningún sentido, ya que se introdujo en la versión 6 junto con' RandomSample' . Por lo tanto, esto tiene más sentido para la mezcla previa a la versión 6: '# [[Pedido [Aleatorio [] &/@ #]]] &' –

Cuestiones relacionadas