Your estimate isn’t actually very good at estimating the population standard deviation (it substantially overestimates it), but it is good for estimating confidence intervals. That’s because confidence intervals also require you to account for the variance of the estimate of the mean, which is large when you only have two samples.
This shows it over estimates (mean: 1.46, median 1.23, while the true standard deviation is 1). Using max—min gives a better estimator by both mean (1.13) and median (0.96). You are right that both the corrected sample standard deviation (max—min / sqrt(2)) and uncorrected sample standard deviation (max—min / 2) are quite biased downwards from the true standard deviation.
That being said, all of these are incredibly noisy estimators: the max-min estimator is only good for being within about 5x of the true value.
Your estimate isn’t actually very good at estimating the population standard deviation (it substantially overestimates it), but it is good for estimating confidence intervals. That’s because confidence intervals also require you to account for the variance of the estimate of the mean, which is large when you only have two samples.
Simulating it out:
import numpy as np
x = np.random.normal(size=(100_000, 2))
diff = np.max(x, axis=1) - np.min(x, axis=1)
std_est = diff * 1.3
print(np.mean(std_est))
print(np.median(std_est))
This shows it over estimates (mean: 1.46, median 1.23, while the true standard deviation is 1). Using max—min gives a better estimator by both mean (1.13) and median (0.96). You are right that both the corrected sample standard deviation (max—min / sqrt(2)) and uncorrected sample standard deviation (max—min / 2) are quite biased downwards from the true standard deviation.
That being said, all of these are incredibly noisy estimators: the max-min estimator is only good for being within about 5x of the true value.