Programımın bir kısmı, liste öğelerini rastgele karıştırmamı gerektiriyor. Bir listeye ihtiyacım olduğunda, listedeki öğeleri rasgele yeniden düzenleyecektir.
Zorunlu numaralı aranjmandaki bir değişiklik aynı arama listesindeki her aramada görülebilir.
Uygulamam düzgün çalışıyor gibi görünüyor, ancak oldukça uzun olduğunu ve kod tabanımı artırdığını hissediyorum ve ayrıca bunun için en iyi çözümün olmadığını hissediyorum. Bu yüzden çok daha kısa bir uygulamaya ihtiyacım var. kabuğunda çalıştırmaya üzerindeListedeki Karıştırıcı Elemanları (Liste Öğelerini rastgele bir şekilde yeniden düzenleyin)
-module(shuffle). -export([list/1]). -define(RAND(X),random:uniform(X)). -define(TUPLE(Y,Z,E),erlang:make_tuple(Y,Z,E)). list(L)-> Len = length(L), Nums = lists:seq(1,Len), tuple_to_list(?TUPLE(Len,[],shuffle(Nums,L,[]))). shuffle([],_,Buffer)-> Buffer; shuffle(Nums,[Head|Items],Buffer)-> {Pos,NewNums} = pick_position(Nums), shuffle(NewNums,Items,[{Pos,Head}|Buffer]). pick_position([N])-> {N,[]}; pick_position(Nos)-> T = lists:max(Nos), pick(Nos,T). pick(From,Max)-> random:seed(begin (case random:seed(now()) of undefined -> NN = element(3,now()), {?RAND(NN),?RAND(NN),?RAND(NN)}; Any -> Any end) end ), T2 = random:uniform(Max), case lists:member(T2,From) of false -> pick(From,Max); true -> {T2,From -- [T2]} end.
:
F:\> erl Eshell V5.8.4 (abort with ^G) 1> c(shuffle). {ok,shuffle} 2> shuffle:list([a,b,c,d,e]). [c,b,a,e,d] 3> shuffle:list([a,b,c,d,e]). [e,c,b,d,a] 4> shuffle:list([a,b,c,d,e]). [a,b,c,e,d] 5> shuffle:list([a,b,c,d,e]). [b,c,a,d,e] 6> shuffle:list([a,b,c,d,e]). [c,e,d,b,a]Ben stdlib böyle bir işlevi var olduğu gerçeğini motive ediyor İşte benim uygulamasıdır. Oyunumun bir yerinde, işleri karıştırmam gerekiyor ve aynı zamanda işe yarayan bir problem değil, problem için en iyi çözümü bulmam gerekiyor.
Bazı yardımlar çözümün daha kısa bir sürümünü oluşturabilir mi? Muhtemelen daha verimli?
Teşekkürler @Adam harika bir çözüm. Onu seviyorum –
merhaba. 'random: uniform' kullanmadan önce tohum eklemeniz gerektiğini ekleyebilir miyim? aksi halde aynı sonuçları sanal makinenin farklı uygulamalarında elde edersiniz ve birçok uygulamada bu istenmeyendir. – user601836
@ user601836 İyi gelin! Her işlem için yalnızca bir kez yapmanız gerektiğini ve her shuffle: list/1' için değil. –