2009-08-19 9 views
5

क्या कोई जानता है कि पर्ल में बिल्कुल उसी तरीके से दो सरणी को यादृच्छिक रूप से कैसे घुमाया जाए?मैं पर्ले में बिल्कुल उसी तरह दो सरणी कैसे घुमा सकता हूं?

फेरबदल से पहले:: उदाहरण के लिए, मैं इन दो सरणियों है कहना सरणी 1: 1, 2, 3, 4, 5 सरणी 2: ए, बी, सी, डी, ई

पुथल के बाद : सरणी 1: 2, 4, 5, 3, 1 सरणी 2: बी, डी, ई, सी,

इसलिए प्रत्येक सरणी में प्रत्येक तत्व इसके बराबर तत्व से जुड़ा हुआ है।

उत्तर

22

प्रयास करें (जैसे कुछ) इस:

use List::Util qw(shuffle); 
my @list1 = qw(a b c d e); 
my @list2 = qw(f g h i j); 
my @order = shuffle 0..$#list1; 
print @list1[@order]; 
print @list2[@order]; 
+1

++। मुझे जितनी बार चाहें उतनी बार उनका उपयोग करना याद नहीं है। – daotoad

+1

@daotoad: मैं दोगुना प्यार हैश स्लाइस: @foobar {qw (foo bar baz qux)} :-) –

+0

बहुत बहुत धन्यवाद! – Abdel

6

List::Utilshuffle का उपयोग इंडेक्स की एक सूची को घुमाने और परिणामों को सरणी पर मानचित्रित करने के लिए करें।

use strict; 
use warnings; 

use List::Util qw(shuffle); 

my @array1 = qw(a b c d e); 
my @array2 = 1..5; 

my @indexes = shuffle 0..$#array1; 
my @shuffle1 = map $array1[$_], @indexes; 
my @shuffle2 = map $array2[$_], @indexes; 

अद्यतन उपयोग क्रिस जेस्टर-यंग समाधान। Array slices एक बेहतर विकल्प है जिसे मैंने सोचा था।

+1

आपको 'मानचित्र' का उपयोग करने की आवश्यकता नहीं है; सरणी को किसी अन्य सरणी द्वारा अनुक्रमित किया जा सकता है, जिसमें सूचकांक शामिल होते हैं। सूची स्लाइस के उपयोग के लिए :-) –

9

पहले: समानांतर सरणियों बुरा कोड का एक संभावित संकेत कर रहे हैं; आपको देखना चाहिए कि क्या आप ऑब्जेक्ट्स या हैश की सरणी का उपयोग कर सकते हैं और खुद को उस परेशानी को बचा सकते हैं।

बहरहाल

:

use List::Util qw(shuffle); 

sub shuffle_together { 
    my (@arrays) = @_; 

    my $length = @{ $arrays[0] }; 

    for my $array (@arrays) { 
    die "Arrays weren't all the same length" if @$array != $length; 
    } 

    my @shuffle_order = shuffle (0 .. $length - 1); 

    return map { 
    [ @{$_}[@shuffle_order] ] 
    } @arrays; 
} 

my ($numbers, $letters) = shuffle_together [1,2,3,4,5], ['a','b','c','d','e']; 

असल में, shuffle का उपयोग यादृच्छिक क्रम में सूचकांक की एक सूची तैयार करें, और उसके सूचकांकों की एक ही सूची के साथ सरणियों के सभी काट करने के लिए।

+4

+1 यह इंगित करने के लिए कि आपके पास समानांतर सरणी नहीं होनी चाहिए, लेकिन किसी और चीज के सरणी (सरणी, हैंश, ऑब्जेक्ट्स, जो भी हो) जो डेटा को भौतिक रूप से एक साथ रखता है। – Tanktalus

+1

+1 यह सुनिश्चित करने के लिए कि सरणी एक ही आकार – lexu

+2

@Tanktalus है: "नहीं होना चाहिए" अत्यधिक मजबूत है। यह कोड गंध है, लेकिन कभी-कभी यह वही तरीका है। जिस तरह से मैं सोच रहा था उसका उपयोग करने के लिए – ysth

6

यहाँ एक और तरीका है:

use strict; 
use warnings; 

use List::AllUtils qw(pairwise shuffle); 

my @list1 = qw(a b c d e); 
my @list2 = qw(f g h i j); 

my @shuffled_pairs = shuffle pairwise{[$a, $b]} @list1, @list2; 

for my $pair (@shuffled_pairs) { 
    print "$pair->[0]\t$pair->[1]\n"; 
} 

आउटपुट:

 
C:\Temp> sfl 
e  j 
b  g 
d  i 
a  f 
c  h 

इस तरह, आप अनुक्रमणिका के लिए एक अतिरिक्त सरणी रखने के लिए जरूरत के बिना @shuffled_pairs सीधे पुनरावृति और सी-शैली छोरों से बच सकते हैं ।

+0

+1। – Axeman