Псевдослучайность с python - PullRequest
       27

Псевдослучайность с python

0 голосов
/ 11 февраля 2020

У меня сейчас проблема с псевдослучайным распределением моих испытаний. Я использую некоторое время l oop, чтобы создать 12 файлов, содержащих 38 строк (или испытаний), которые соответствуют 1 критерию:

1) max color1expl не может быть одинаковым в 3 последовательных строках

Где color1expl - один из столбцов в моем фрейме данных.

Когда у меня есть файлы только для 38 строк, следующий скрипт, кажется, работает отлично.

import pandas as pd

n_dataset_int = 0
n_dataset = str(n_dataset_int)

df_all_possible_trials = pd.read_excel('GroupF' + n_dataset + '.xlsx') # this is my dataset with all possible trials


# creating the files
for iterations in range(0,12): #I need 12 files with pseudorandom combinations

    n_dataset_int += 1 #this keeps track of the number of iterations
    n_dataset = str(n_dataset_int) 

    df_experiment = df_all_possible_trials.sample(n=38) #38 is the total number of trials
    df_experiment.reset_index(drop=True, inplace=True)

    #max color1expl cannot be identical in 3 consecutive trials (maximum in 2 consecutive t.)

    randomized = False

    while not randomized: #thise while loop will make every time a randomization of the rows in the dataframe
        experimental_df_2 = df_experiment.sample(frac=1).reset_index(drop=True) 
        for i in range(0, len(experimental_df_2)):
            try:
                if i == len(experimental_df_2) - 1:
                    randomized = True
                elif (experimental_df_2['color1expl'][i] != experimental_df_2['color1expl'][i+1]) or (experimental_df_2['color1expl'][i] != experimental_df_2['color1expl'][i+2])
                    continue
                elif (experimental_df_2['color1expl'][i] == experimental_df_2['color1expl'][i+1]) and (experimental_df_2['color1expl'][i] == experimental_df_2['color1expl'][i+2]):
                    break    
            except:
                pass

    #export the excel file
    experimental_df_2.to_excel('GroupF_r' + n_dataset + '.xlsx', index=False) #creates a new                                  

Однако при выполнении той же процедуры увеличения числа с n=38 до n=228 сценарий запускается неопределенное количество времени. Пока что прошло больше одного дня и он не выдал ни одного из 12 файлов. Возможно, потому что слишком много комбинаций, чтобы попробовать.

Есть ли способ улучшить этот скрипт, чтобы он работал с большим количеством строк?

1 Ответ

0 голосов
/ 11 февраля 2020

Я думаю, что вы можете изменить способ, которым вы используете для генерации случайных выборок (псевдокод):

n = 38 # or anything else

my_sample = []

my_sample.append( pop_one_random_from(df_all_possible_trials) )
my_sample.append( pop_one_random_from(df_all_possible_trials) )

while len(my_sample) < n:
  next_one = pop_one_random_from(df_all_possible_trials)
  if next_one is equal to my_sample[-1] and my_sample[-2]:
    put next_one back to df_all_possible_trials
    continue
  else:
    my_sample.append( next_one )

Если я правильно понял, все различные выборки (общее количество комбинаций, 'len ( df_all_possible_trials) выберите n ') с той же вероятностью, которую вы выбираете, и это то, что вы ищете. И это должно работать быстрее.

...